test

CakePHP Note

AuthComponent

UPDATE:2009.11.26

AuthComponentを使ってユーザー認証の仕組みを追加することができます。パスワード情報はハッシュ化して扱います。有効期間はセッションに関する設定(Session.timeoutとSecurity.level)に従います。また、自動ログイン機能について次ページ以降で説明します。

ページ遷移は次のようになります。

  1. ログインが必要なページAにアクセス
  2. ログインページへリダイレクト(users/login,$loginAction属性で設定可能)
  3. ログイン・フォームを送信
  4. ログイン直前のページ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メソッドでハッシュ化してデータを保存する必要があります。