cakephp2.doc_021
R e i - D r e a m
for Laravel
TOP > CakePHP2 > Component関連(認証)
Guest
login

最終投稿日:2019年11月20日

Component関連(認証)
CakePHP2.6.12
【Auth認証】
※【注意】CakePHP2.4以降からは、パスワードのハッシュ化に「SimplePasswordHasherクラス」を使うようになりました。

■「Controller/AppController.php」
    基本的にシステム全体に認証をかける場合が多いのでここに設定する
    public $components = array("Auth");

【メモ】
    Auth認証を一部のアクションにだけ適用しない場合は各コントローラにて以下を記述

    function beforeFilter(){
        $this->Auth->allow('index');
    }
    ※$this->Auth->allow();                 //全てのアクションが認証不要

■「Model/User.php」

    登録の際のバリデート等を好きなようにかける(Auth認証とは関係ない)
    
    ※パスワードをハッシュ化して登録したい場合は以下を記述
            
■「Controller/UsersController.php」
    
    実際にログイン処理をするコントローラ

    class UsersController extends AppController {
        public $components = array('Session','Auth');
        public function beforeFilter() {
            //parent::beforeFilter();
            //どちらも呼ばれるので使い分けがわからない
            $this->Auth->authError = '再度ログインしてください';
            //どちらも呼ばれるので使い分けがわからない
            $this->Auth->loginError = 'IDまたはパスワードが違います';
            $this->Auth->authenticate = array(
                "Form" => array(
                    //パスワードのハッシュを無効にするにはここが重要!!(デフォルトは[Simple])
                    'passwordHasher' => 'Mycreate',
                    //ログインもモデル名指定
                    "userModel" => "User",
                    "fields" => array(
                            //ユーザー名カラム名指定
                            "username" => "username",
                            //パスワードカラム名指定
                            "password" => "password",
                        ),
                    //削除フラグをログインさせない
                    "scope" => array("User.del"=>0),
                )
            );
            //ログイン画面を指定
            $this->Auth->loginAction    = array('controller' => 'users', 'action' => 'login');
            //ログイン後のリダイレクト先指定(デフォルトはリファラー)
            $this->Auth->loginRedirect  = array('controller' => 'tests', 'action' => 'index');
            //ログアウト後のリダイレクト先
            $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
            //$this->Auth->allow('add');
        }

        function login(){
            if ($this->Auth->login()){
                return $this->redirect($this->Auth->redirect());
            }else{
                if(!empty($this->request->data["User"]["username"])){
                    $this->set("myerror",$this->Auth->loginError);
                }
            }
        }

        function logout() {
            $this->redirect($this->Auth->logout());
        }
}

■「View/Users/login.ctp」

    ログイン画面

    <?php if(isset($myerror)){echo "<b><font color='red'>".$myerror."</font></b><br />";} ?>
    <?php echo $this->Form->create('User');?>
        <fieldset>
            <legend><?php echo __('Please enter your username and password'); ?></legend>
        <?php
            echo $this->Form->input('username');
            echo $this->Form->input('password');
        ?>
        </fieldset>
    <?php echo $this->Form->end(__('Login'));?>


【パスワードの暗号化を無効にするには】
  デフォルトの設定だとパスワードは内部的にハッシュ化されて評価される
  これを無効にするには以下の手順にて設定する

■「Controller/Component/Auth/MycreatePasswordHasher.php」
    上記「Auth」ディレクトリとファイルを新規作成する
        ※ファイル名は「[任意]PasswordHasher.php」とルールがあります

    <?php
        App::uses('AbstractPasswordHasher', 'Controller/Component/Auth');
        class MycreatePasswordHasher extends AbstractPasswordHasher {

            public function hash($password) {
                //自分で実装した暗号化ロジック
                return md5($password);
            }

            public function check($password, $hashedPassword) {
                //return $hashedPassword === $this->hash($password);
                //これでハッシュ化されません
                return $password;
            }
        }
    ?>

    ※ライブラリにある「SimplePasswordHasher.php」を継承したクラスとなります

< 逆にハッシュ化して保存するには >

認証チェック側は上記の「check」メソッドを入れ替えれば「hash」メソッドが呼ばれるためハッシュの認証となる。
そのためには新規ユーザー保存時にパスワードをハッシュ化して保存する必要があるため UserModelをカスタマイズする。

    [app][Model][User.php]

        <?php

            App::uses('AppModel', 'Model');
            //独自クラスを呼び出す
            App::uses('MycreatePasswordHasher', 'Controller/Component/Auth');
            class User extends AppModel {

                public $name = 'User';
        
                //CakePHP2.36以降は引数を受け取る
                public function beforeSave($options = array()) {
                    if (!$this->id) {
                        $passwordHasher = new MycreatePasswordHasher();
                        $this->data['User']['password'] = $passwordHasher->hash($this->data['User']['password']);
                    }
                    return true;
                }
        
            }
        ?>
            
CakePHP2.3.6
【設定手順】

■「Controller/AppController.php」
    基本的にシステム全体に認証をかける場合が多いのでここに設定する
    public $components = array("Auth");

【メモ】
    Auth認証を一部のアクションにだけ適用しない場合は各コントローラにて以下を記述

    function beforeFilter(){
        $this->Auth->allow('index');
    }


■「Model/User.php」

    登録の際のバリデート等を好きなようにかける(Auth認証とは関係ない)
    ※パスワードをハッシュ化して登録したい場合は以下を記述

    <?php
        App::uses('AuthComponent', 'Controller/Component');
        class User extends AppModel {
            //パスワードをハッシュ化して保存するために下記を追加
            //CakePHP2.36 は引数を受け取る
            public function beforeSave($options = array()) {
                if (isset($this->data[$this->alias]['password'])) {
                    $this->data[$this->alias]['password'] 
                        = AuthComponent::password($this->data[$this->alias]['password']);
                }
                return true;
            }

        }
    ?>

    【メモ】
        Auth認証に関するcakep2.2のテーブル関係のデフォルト値は、
        
            テーブル名      users
            ユーザーカラム  username
            パスワード      password

■「Controller/UsersController.php」
    
    実際にログイン処理をするコントローラ
    
    public $components = array('Session','Auth');

    public function beforeFilter() {
        //parent::beforeFilter();
        //どちらも呼ばれるので使い分けがわからない
        $this->Auth->authError = '再度ログインしてください';
        //どちらも呼ばれるので使い分けがわからない
        $this->Auth->loginError = 'IDまたはパスワードが違います';
        $this->Auth->authenticate = array(
                "Form" => array(
                    //ログインもモデル名指定
                    "userModel" => "User",
                    "fields" => array(
                            //ユーザー名カラム名指定
                            "username" => "username",
                            //パスワードカラム名指定
                            "pasword" => "pasword",
                        ),
                    //削除フラグをログインさせない
                    "scope" => array("User.del"=>0),
                )
            );
        //ログイン画面を指定
        $this->Auth->loginAction    = array('controller' => 'users', 'action' => 'login');
        //ログイン後のリダイレクト先指定(デフォルトはリファラー)
        $this->Auth->loginRedirect  = array('controller' => 'tests', 'action' => 'index');
        //ログアウト後のリダイレクト先
        $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
        //$this->Auth->allow('add');
    }

    ※「$this->Auth->authenticate」に関しては、テーブル情報等に変更がある場合に設定する

    function login(){
        if ($this->Auth->login()){
            return $this->redirect($this->Auth->redirect());
        }else{
            if(!empty($this->request->data["User"]["username"])){
                $this->set("myerror",$this->Auth->loginError);
            }
        }
    }

    function logout() {
        $this->redirect($this->Auth->logout());
    }

    //ユーザ追加する場合は以下
    function add(){
        if ($this->request->is('post')){
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                $this->redirect(array('action' => 'login'));
            }else{
                //保存失敗
            }
        }
    }

■「View/Users/login.ctp」

    ログイン画面

    <?php if(isset($myerror)){echo "<b><font color='red'>".$myerror."</font></b><br />";} ?>
    <?php echo $this->Form->create('User');?>
        <fieldset>
            <legend><?php echo __('Please enter your username and password'); ?></legend>
        <?php
            echo $this->Form->input('username');
            echo $this->Form->input('password');
        ?>
        </fieldset>
    <?php echo $this->Form->end(__('Login'));?>


【パスワードの暗号化を無効にするには】


デフォルトの設定だとパスワードは内部的にハッシュ化されて評価される
これを無効にするには以下の手順にて設定する

■「Controller/Component/Auth/MyFormAuthenticate.php」

    上記「Auth」ディレクトリとファイルを新規作成する
        ※ファイル名は「[任意]Authenticate.php」とルールがあります

    <?php
    App::uses('FormAuthenticate', 'Controller/Component/Auth');
        class MyFormAuthenticate extends FormAuthenticate {
            protected function _password($password){
            return $password;
        }

    }
    ?>

    ※ライブラリにある「FormAuthenticate.php」を継承したクラスとなります

■「Controller/UsersController.php」

    内容を一部変更する

    public $components = array('Session','Auth');
   ⇒
    public $components = array('Session','Auth'=> array('authenticate'=>array('MyForm')));


    上記設定でパスワードをそのまま評価する様になります。

    ※$this->Auth->authenticate = array(
                                        "Form" => array(...
    上記の設定をしている場合は「Form」を「MyForm」に変更する必要があります
            
CakePHP2.1
【設定手順】

■「Controller/AppController.php」
    基本的にシステム全体に認証をかける場合が多いのでここに設定する
    public $components = array("Auth");

【メモ】
    Auth認証を一部のアクションにだけ適用しない場合は各コントローラにて以下を記述

    function beforeFilter(){
        $this->Auth->allow('index');
    }

■「Model/User.php」
    登録の際のバリデート等を好きなようにかける(Auth認証とは関係ない)
    
    ※パスワードをハッシュ化して登録したい場合は以下を記述

    <?php
        App::uses('AuthComponent', 'Controller/Component');
        class User extends AppModel {

            //パスワードをハッシュ化して保存するために下記を追加
            public function beforeSave() {
                if (isset($this->data[$this->alias]['password'])) {
                    $this->data[$this->alias]['password'] 
                        = AuthComponent::password($this->data[$this->alias]['password']);
                }
                return true;
            }

        }
    ?>

    【メモ】
        Auth認証に関するcakep2.1のテーブル関係のデフォルト値は、
        
            テーブル名      users
            ユーザーカラム  username
            パスワード      password

■「Controller/UsersController.php」
    
    実際にログイン処理をするコントローラ
    
    public $components = array('Session','Auth');

    public function beforeFilter() {
        //parent::beforeFilter();
        //どちらも呼ばれるので使い分けがわからない
        $this->Auth->authError = '再度ログインしてください';
        //どちらも呼ばれるので使い分けがわからない
        $this->Auth->loginError = 'IDまたはパスワードが違います';
        $this->Auth->authenticate = array(
                "Form" => array(
                    //ログインもモデル名指定
                    "userModel" => "User",
                    "fields" => array(
                            //ユーザー名カラム名指定
                            "username" => "username",
                            //パスワードカラム名指定
                            "pasword" => "pasword",
                        ),
                    //削除フラグをログインさせない
                    "scope" => array("User.del"=>0),
                )
            );
        //ログイン画面を指定
        $this->Auth->loginAction    = array('controller' => 'users', 'action' => 'login');
        //ログイン後のリダイレクト先指定(デフォルトはリファラー)
        $this->Auth->loginRedirect  = array('controller' => 'tests', 'action' => 'index');
        //ログアウト後のリダイレクト先
        $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
        $this->Auth->allow('add');
    }

    ※「$this->Auth->authenticate」に関しては、テーブル情報等に変更がある場合に設定する

    function login(){
        if ($this->Auth->login()){
            return $this->redirect($this->Auth->redirect());
        }else{
            if(!empty($this->request->data["User"]["username"])){
                $this->set("myerror",$this->Auth->loginError);
            }
        }
    }

    function logout() {
        $this->redirect($this->Auth->logout());
    }

    //ユーザ追加する場合は以下
    function add(){
        if ($this->request->is('post')){
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                $this->redirect(array('action' => 'login'));
            }else{
                //保存失敗
            }
        }
    }


■「View/Users/login.ctp」

    ログイン画面

    <?php if(isset($myerror)){echo "<b><font color='red'>".$myerror."</font></b>"<br />";} ?>
    <?php echo $this->Form->create('User');?>
        <fieldset>
            <legend><?php echo __('Please enter your username and password'); ?></legend>
        <?php
            echo $this->Form->input('username');
            echo $this->Form->input('password');
        ?>
        </fieldset>
    <?php echo $this->Form->end(__('Login'));?>


【パスワードの暗号化を無効にするには】


デフォルトの設定だとパスワードは内部的にハッシュ化されて評価される
これを無効にするには以下の手順にて設定する

■「Controller/Component/Auth/MyFormAuthenticate.php」

    上記「Auth」ディレクトリとファイルを新規作成する
        ※ファイル名は「[任意]Authenticate.php」とルールがあります


    <?php
    App::uses('FormAuthenticate', 'Controller/Component/Auth');
        class MyFormAuthenticate extends FormAuthenticate {
            protected function _password($password){
            return $password;
        }

    }
    ?>

    ※ライブラリにある「FormAuthenticate.php」を継承したクラスとなります

■「Controller/UsersController.php」

    内容を一部変更する

    public $components = array('Session','Auth');
   ⇒
    public $components = array('Session','Auth'=> array('authenticate'=>array('MyForm')));


    上記設定でパスワードをそのまま評価する様になります。



    ※$this->Auth->authenticate = array(
                                        "Form" => array(...

    上記の設定をしている場合は「Form」を「MyForm」に変更する必要があります

            
ログインしてコメントを残そう!!


きっぷる