test
CakePHP Note
AuthComponent
AuthComponentを使ってユーザー認証の仕組みを追加することができます。パスワード情報はハッシュ化して扱います。有効期間はセッションに関する設定(Session.timeoutとSecurity.level)に従います。また、自動ログイン機能について次ページ以降で説明します。
ページ遷移は次のようになります。
- ログインが必要なページAにアクセス
- ログインページへリダイレクト(users/login,$loginAction属性で設定可能)
- ログイン・フォームを送信
- ログイン直前のページAへリダイレクト
準備1
AuthComponentがデフォルトで参照するデータベースのテーブルは、id,username,passwordという名前のカラムを含むusersテーブルとなっています。別のテーブルやカラム名を使いたいときは、AuthComponentの属性を使って変更できます。
準備2
ログイン/ログアウト用のコントローラーを作成します。$components属性に‘Auth’を設定します。コントローラの中から$this->Authで参照できるようになります。
class UsersController extends AppController {
var $components = array("Auth");
}
ログインとログアウト用のアクションを追加します。
class UsersController extends AppController {
var $components = array("Auth");
function login() {
//1. ログイン用フォームを表示する($this->dataが空の場合)
//2. ユーザー認証する($this->dataに値がセットされている場合)
}
function logout() {
$this->Session->setFlash('ログアウトしました');//必要に応じて
$this->redirect($this->Auth->logout());//ログアウトし、ログイン画面へリダイレクト
}
}
ログイン用のビューを作成します。app/view/users/login.ctp
echo $form->create('User', array( 'action' => 'login'));
echo $form->input('username');
echo $form->input('password');
echo $form->end('Login');
利用方法
ユーザー認証が必要なコントローラの$component属性に'Auth'をセットするだけで利用できます。
class FoosController extends AppController {
var $components = array('Auth');
}
特定のアクションをユーザー認証なしで許可する場合は、allowメドッドで許可します。
class FoosController extends AppController {
var $components = array('Auth');
function beforeFilter(){
$this->Auth->allow('index','view');
}
}
AuthComponentの属性
- $autoRedirect ログイン後に自動でリダイレクトするかどうか。
- $userModel = 'User'(ユーザーのデータを参照するモデル名)
- $fields = array('username' => 'username', 'password' => 'password')(ユーザー名とパスワードのカラム名)
- $userScope (ユーザー認証の際の追加条件array('acrive'=>'1')とか);
- $loginAction(デフォルトは$userModel/loginに設定されます)
- $loginRedirect = null (ログイン成功時の転送先, controllerとactionを配列で指定)
- $logoutRedirect(ログアウト時の転送先, controllerとactionを配列で指定、デフォルトは$loginActionの値)
- $loginError = null(ログイン失敗時のエラーメッセージ、'Message.auth'というキーのセッションに設定されます)
- $authorize=false(認証後の追加処理のタイプ。controller/model/actions/crud/object。controller/model/objectの場合はそのオブジェクトのisAuthorizedメソッドを呼び出す。actions/crudの場合は、Aclのcheckメソッドを呼ぶ)
AuthComponentのメソッド
- allow() 許可するアクション名(引数なしで全て許可)
- deny() 許可しないアクション名
- password()ハッシュ化する
注意点
ハッシュ化されるパスワードとユーザー登録
コントローラのアクションで$this->dataを利用する時やモデルでデータを検証しようとする時にはすでにハッシュ化されたパスワードになっています。したがって単純に'password'と'password_confirm'の入力の同一性を確認したり、'password'フィールドに検証ルールを設定して文字数チェックを行うなどの検証ができません。これはAuthComponentがアクションを実行する前にフォームから送られたデータにユーザー名とパスワードに相当するフィールド($fieldsプロパティで設定可能)が揃っているとパスワードをハッシュ化するようになっているからです。ユーザー登録を行うアクションの際には一時的にAuthComponentがパスワードをハッシュ化しないようにする必要があります。以下のような方法が考えられます。
コントトローラーのbeforeFilterメソッド内で
- AuthComponentのauthenticateプロパティにパスワードをハッシュ化しないhashPasswordsメソッドを含むオブジェクトを指定する
- AuthComponentのfieldsプロパティでパスワードのフィールド名を実在しない名前にする
class UsersController extends AppController {
var $components = array('Auth');
function beforeFilter(){
parent::beforeFilter();
$this->Auth->allow('add');
if($this->action=="add" ){
//$this->Auth->authenticateを設定するか
//$this->Auth->fieldsを設定する
}
}
}
もしくは
- フォームで使うフィールド名を'password_input','password_confirm'などの別名で扱う
最終的にはAuthComponentのpasswordメソッドでハッシュ化してデータを保存する必要があります。
