CakePHPのAuthComponent実装+ブラウザ閉じても認証保持

初心者がCakePHPを使った開発を進めます(これまでのCakePHP)。
CakePHPガイドブックを参考に基本的なアプリができたので、これを自分色に染めていきます。
まず認証周りを強化したい。そこでCakePHPの1.2から用意されたAuthComponentという認証に便利なコンポーネントを実装してみました。
参考サイトは下記。ここのコードをコピーすれば基本的に問題ありません。
【CakePHP】AuthComponentについてのまとめ 【ざっくり基本編】 | ねねとまつの小部屋
【CakePHP】AuthComponentについてのまとめ その2【ちょっとしたコツ編】 | ねねとまつの小部屋
あとCakePHPの公式マニュアルも詳しいです。
The Cookbook :: 1.2 Collection :: マニュアル :: 組み込みのコンポーネント :: 認証
ただ、小生の場合はCakePHPガイドブックにあったSessionでの認証を実装していたので、それを外す作業が必要でした。
以下自分メモ。ガイドブックからの変更点など。


*app/controllers/app_controller.php
function beforeFilter(){
var $components = array('Auth');//注1
$this->Auth->loginError = 'ログインエラーです';
$this->Auth->authError = '権限がありません';
//mailとパスワードでの認証に変更
$this->Auth->fields = array('username' => 'mail','password' => password');
//ユーザー情報取得してviewで使う
//$this->set("auth",$auth);//CakePHPガイドブック
$this->set('user',$this->Auth->user());//変更点
}

注1.本来は認証が必要なcontrollerのみ記載するのだがview/layouts/default.ctpでユーザー名取得のため$userを使うのでapp_controllerに記載した(これがわからなくて大変だった)。後で何とかしたい。
*app/controllers/users_controller.php
参考サイトとほぼ一緒。
基本編とコツ編のbeforeFilter()の違いparent::beforeFilter();を忘れずに。
parent::beforeFilter();をしないとapp_controller.phpの内容が引き継がれません(はまった)。
また参考サイトはadd()の“$this->redirect(array(’action’ => ‘index’));”の記述に全角があるので注意(コピペしてはまった)。
他のcontrollerのアクションでもガイドブックの認証処理を変更する必要があります。
追加(beforeFilter()を設置する場合のみ)
function beforeFilter() {
parent::beforeFilter();
}

変更
//$auth = $this->Session->read('auth');//Cakephpガイドブック
//$cond = array('user_id'=>$auth['id']);//Cakephpガイドブック
$user = $this->Auth->user();//AuthComponent
$cond = array('user_id' => $user['User']['id']);//AuthComponent

*app/views/users/login.ctp
ログインフォームのinputをusernameからmailに。
echo $form->create('User', array('action' => 'login'));
echo $form->input('mail');//usernameからmailでの認証
echo $form->input('password');
echo $form->submit();
echo $form->end();

*app/views/layouts\default.ctp
ガイドブックの認証処理を変更。app_controller.phpで得た$usrを使うように修正。
//48行目近辺
if ($user){
echo $auth['User']['name']."さん-user_id".$auth['User']['id'];
echo $html->link("ログアウト","/users/logout");
}else{
echo $html->link("ログイン","/users/login");
}

//61行目近辺Message.authを追加
if ($session->check('Message.auth')) {
$session->flash('auth');
}

以上で作業完了です。
なおパスワードが暗号化されてDBに保存されるようになるので、これまで使用していたユーザーは使えなくなるので注意!(はまった)
これで認証まわりの設定がAuthComponentで処理されるようになりました。
なんて楽チンなんだろ。

ブラウザを閉じても認証状態を保持

この認証状態はブラウザを閉じると終了になり再度ログインが必要となります。やっぱり認証状態はブラウザを閉じた後でも維持させたい。
参考にしたのは下記。
CakePHP Note:自動ログインその1
ID,PWを暗号化してCookieに保存し、ログイン処理でそれを利用する方式です
(セキュリティ的に高めたい場合は「その2」の方式で)。
こちらもコピペで問題ないのですが、なぜかチェックボックスの機能が生きず、常に認証を保存する動作になってしまいました(小生の問題かもしれません)。
そこで下記のように修正。
if ($this->Auth->user()) {
//if (!empty($this->data)) {//もともと
if (!empty($this->data['User']['remember_me']))//remember_meの有無チェック
$cookie = array();

これでチェックボックスが機能するようになりました。
(でもunset($this->data[‘User’][‘remember_me’]);が何しているか不明。教えてエライ人!)

9月29日追記

恐れながらCakePHP Noteの管理者さんに直接メールで確認させて頂きました。すると素早いご回答が!
やはりdata[‘User’][‘remember_me’]で確認すべきだったようです。
またunset()については、チェック後は不要なため消去する処理とのこと。
なるほど。DBに保持しない以上、その場で消してしまう手法を覚えた。
これで認証周りはイメージ通りの動きに。
いよいよ次はガイドブックに無い機能の追加だ!

コメント

  1. AuthComponentでusersの値を取得する際の注意

    初心者がCakephpをやる件で以前にAuthComponentを実装しました(参考:CakePHPのAuthComponent実装+ブラウザ閉じても認証保持)。DBにusersテーブルを作成しusernameとpasswordフィールドがあれば、それを使用し…

  2. ラボブログ より:

    CakePHP の自動ログインの実装について調べてみました。

    スパイスラボ神部です。 CakePHP の自動ログインの実装について調べてみました。 -$user=$this->Auth->user(); $this->__…

タイトルとURLをコピーしました