ひさびさにPHPをやる機会があり、短期での開発だったため、cakePHPを使いました。
以前やったことがあったんですが、もう2年以上たっていますね。
といいつつも昔のソースを見ながらやることで思い出しましたし、ここ2日ぐらいしか触っていませんが、以前よりもソースがきれいに書けるようになってますね。
基本的なことは割愛し、認証部分について書きたいと思います。versionは2.5です。
特別なライブラリのインポートとかはいらないです。
Contents
モデルの定義
モデル名はなんでもいいんですけどテーブル名がUsers、ユーザー名とパスワードをusername,passwordにしておくとパラメータの変更がいらないので楽でしょう。
もちろんこれ以外のテーブル名やカラム名でも認証機能は使えます。
以下のソースの例ですがテーブル名admins,ユーザー名相当フィールドはusername、パスワード相当フィールドはpasswordとします。
コントローラーでの処理
コントローラーでの処理はまず認証を行いたいコントローラで$componentを定義します。
全体に認証をかけたいようなときはAppControllerがいいでしょう。
$component
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public $components = array ( 'Session', 'Cookie', 'Auth' => array ( 'loginRedirect' => array ( 'controller' => 'admin', 'action' => 'index' ), 'logoutRedirect' => array ( 'controller' => 'admin', 'action' => 'login' ), 'loginAction' => array ( 'controller' => 'admin', 'action' => 'login' ),//テーブル名がuserでないときは↓下記のように設定します。 'authenticate' => array( 'Form' => array( 'userModel' => 'Admin' ) ) ) ); |
コードを見てもらえればわかりますが
ログイン後どのページにとぶかをloginRedirect,
ログアウト後どのページにとぶかをlogoutRedirect、
ログイン自体をどのプログラムで行うかをloginActionで定義します。
またテーブル名がUsersの時はいらないのですが、任意の名前にしたいとき(上記の例でいうとadminsテーブル)は
‘authenticate’=>・・・で定義する必要があります。(上記のコードでは書いていないですが、ユーザー名とパスワードに相当するカラムも指定できます。)
Auth->allow
認証がかかると当然、認証されていないページには入れなくなりますが、ログイン画面自体に認証が働いている場合、ログイン自体ができません(ユーザーの作成すらできないですね)。
そのため、認証をしないページをAuth->allowで設定できます。
一般的にはbeforeFilterなどページにアクセスする前に記述されることが多いです。
例えばloginページとlogoutページのみはずす場合は下記のように記述します。
1 2 3 |
public function beforeFilter() { $this->Auth->allow ( 'login', 'logout' ); } |
ログインのコード
実際にloginとlogoutのコードは下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * ログインメソッド */ public function login() { if ($this->Auth->loggedIn ()) { $this->redirect ( $this->Auth->redirect () ); } if ($this->request->is ( 'post' )) { if ($this->Auth->login ()) { $this->redirect ( $this->Auth->redirect () ); } else { $this->Session->setFlash ( '管理画面ログインに失敗しました。正しいユーザー名とパスワードを入力してください。', 'default', array (), 'auth' ); } } } |
1 2 3 4 5 6 |
/** * ログアウト処理を行います */ public function logout() { $this->redirect ( $this->Auth->logout () ); } |
バージョンが違うと微妙にこの辺の書き方が違うんですよね・・・
またログイン後のページで認証を取得したユーザーの情報を見たいときは
特定のフィールド $userId = $this->Auth->user ( ‘id’ );
レコード全体 $this->Auth->user ()
になります。
保存時のコード
肝心のログインユーザーなんですが、登録するときにパスワードを平文で登録しておくと認証がとおりません。下記のように保存前にハッシュ化してあげるのがいいでしょう。
1 2 3 4 5 6 7 8 9 10 11 |
/** * ユーザー登録をするとき * にパスワードを暗号化して記録する * @see Model::beforeSave() */ public function beforeSave( $option = array()) { if (isset ( $this->data [$this->alias] ['password'] )) { $this->data [$this->alias] ['password'] = AuthComponent::password ( $this->data [$this->alias] ['password'] ); } return true; } |
ちなみに2系では上記のように引数に$optionがないとエラーになります。
ビュー側での処理
view側での処理も非常に楽です。下記のように書いてあげればOKです。
1 2 3 4 5 6 7 8 |
<div style="width: 500px;"> <?php echo $this->Session->flash('auth'); ?> <?php echo $this->Form->create('Admin'); ?> <?php echo $this->Form->input('username'); ?> <?php echo $this->Form->input('password'); ?> <?php echo $this->Form->submit('ログイン'); ?> <?php echo $this->Form->end(); ?> </div> |
参考リンク
CakePHP2.xのユーザー認証(Auth)の実装とかなんとか – PHP
CakePHP $this->Auth->user(‘フィールド’)が取得できない時にチェックすべきこと PHP
【CakePHP】CakePHP2.x : ModelのbeforeSave()メソッドのStrict (2048)エラー対応
http://book.cakephp.org/2.0/ja/core-libraries/components/authentication.html
やっぱ有名なフレームワークだと情報がいろいろあるのが楽ですね。