ウェブアプリのMVC構成、コードの自動生成。Scaffold。
と順に追いかけてきましたが、
次は。。
ウェブアプリを開発する場合、「ユーザー認証」は避けて通れないので、
次のステップとして、ユーザー認証を題材にして、新登場するいくつかの事を学習していきたいと思います。
FuelPHPに用意された認証パッケージ
FuelPHPでは、デフォルトで、以下の3種類が使えるようです。
これから、(何回かにわけて)上から順に動作を確認していきますよ。
- Simpleauth
- ユーザー情報を「データベース」その他の情報を「設定ファイル」へ保存し、ユーザー認証する、シンプル(?)な認証
- Ormauth
- Simpleauthが設定ファイルに保存した情報を、データベースへ保存する方式。
より高度なアクセスコントロールができるらしい。。
- Opauth
- ここ数年、多くのウェブサイトで見かける「Teitterでログイン」的なヤツの事。
かっこいいw ユーザー情報をもたなくていいなら、これが良さげ。
設定 - Simpleauth編
設定ファイル - Simpleauth編
パッケージの設定ファイルを、appの方へコピーします。
/fuel/app/config$ cp ../../packages/auth/config/auth.php . /fuel/app/config$ cp ../../packages/auth/config/simpleauth.php .
なぜか、なにも修正しなくても動きますw
ただ、セキュリティ上、修正したほうが良い項目もあります。
- saltとは?
ソルト。塩です。
パスワードは、そのまま「平文」で保存するのは危険なので、
あるルールで変換して保存します。(ハッシュ)
ユーザーがログインするときに入力する文字列も、あるルールで変換して、
変換後の値が保存した値と一致しているかを見ているようです。
(パスワードそのものが一致しているのを確認してるわけではないようです。。)
その時に、
パスワードをハッシュする前にパスワードに「内緒の文字列」をくっつけて、ハッシュすることで、
パスワード単体のハッシュ値とは異なるハッシュ値を得て、セキュリティを高める意味合いがあります。
この「内緒の文字列」が「塩」です。
塩というのは、“隠し味"的な意味でしょうか??
パッケージのいつもロード(always_load)設定
/fuel/core/config
'always_load'→‘packages’配列に、authを追加。
マイグレーション - Simpleauth編
oil refine migrate --packages=auth
とすると、/fuel/package/auth/migration/にあるマイグレーションファイルを実行してくれるみたい。。
$ oil refine migrate --packages=auth Performed migrations for package:auth: 001_auth_create_usertables 002_auth_create_grouptables 003_auth_create_roletables 004_auth_create_permissiontables 005_auth_create_authdefaults 006_auth_add_authactions 007_auth_add_permissionsfilter 008_auth_create_providers 009_auth_create_oauth2tables 010_auth_fix_jointables
コード作成 - Simpleauth編
とにかく、最低限ログインの成否とユーザー登録だけできるようにしました。
セキュリティ上も、絶対ヤバイので、要注意です。
Controller - Simpleauth編
自動コード生成のための補習 - Controller編 - きまブログ
自動コード生成のための補習 - View編 - きまブログ
を参考にして、
コントローラーを自動生成します。
$ oil generate controller login register
生成されたコードを、
はじめに - Simpleauth - Auth パッケージ - FuelPHP ドキュメント
を参考にして、以下のように、修正します。
とはいっても、ほとんど、このサンプルページと同じですw
ただ、「ログイン成功ページ」を作るのがめんどかったんで、
「成功」表示だけして、ログイン画面を戻りますw無限ループです。
失敗すると「失敗」表示されます。
/fuel/app/classes/controller$ cat ./login.php <?php class Controller_Login extends Controller_Template { public function action_index() { $data = array(); if (Input::post()) { if(Auth::login(Input::post('email'), Input::post('password'))) { Session::set_flash('success','login success.'); } else { Session::set_flash('error','login failure.'); } } $this->template->title = 'Login'; $this->template->content = View::forge('login/index', $data); } public function action_register() { $data = array(); if (Input::post()) { Auth::create_user( Input::post('username'), Input::post('password'), Input::post('email') ); Session::set_flash('success','success create your account.'); Response::redirect('login/'); } $data["subnav"] = array('register'=> 'active' ); $this->template->title = 'Login » Register'; $this->template->content = View::forge('login/register', $data); } }
View - Simpleauth編
Viewは、ログイン画面と、ユーザー登録用の画面作成しておきます。
/fuel/app/views/login$ cat index.php <p>Login</p> <?php echo Form::open(); echo Form::input('email'); echo Form::input('password'); echo Form::submit('submit','Login'); echo Form::close(); echo Html::anchor('login/register','Please, Regist'); ?>
/fuel/app/views/login$ cat register.php <p>Register</p> <?php echo Form::open(); echo Form::input('email'); echo Form::input('username'); echo Form::input('password'); echo Form::submit('submit','Regist Me.'); echo Form::close(); echo Html::anchor('login/','Back to Login'); ?>
新しく使うAuthクラスのメソッドで使うのは、2つ。特に難しい感じはしません。
・Auth::login(‘ユーザー名orメアド’,'パスワード’);
そのまま。。ログインに使います。
・Auth::create_user('ユーザー名','パスワード',’メアド’);
そのまま。。ユーザー作成に使います。
メモ
とりあえず、現状での問題点は、こんな感じかな?
セキュリティ上、かなりやばい。
下にも書いた項目以外にも、この状態はかなりヤバイです。
ただ、性善説的なプライベートネット内で、
ミス予防程度のログイン管理ならこれでいいかもw
文字列検査してない。
全部空白で「Regist Me.」ボタンを押すと、create_user()メソッドで例外を吐く。
必要に応じて、特殊な記号とか、メアドの検査とかしなきゃいけない。
未ログイン状態の処理
ログインしていない場合、ログイン画面へ誘導しなくちゃいけない。
これは before()に書いとくのか?
ほかにもいろいろ画面が必要なんだね。。
- ユーザー情報編集画面
- 管理画面
とりあえず、Simpleauthは、以上です。。