Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

CakePHP2、Authで認証項目を追加したい時

More than 3 years have passed since last update.

ログイン認証で、普通はIDとパスワードだけだが、ここになんか例えば学校コードみたいのも入れたい、なんて話になった時にどうするか?
学校に所属する生徒=ユーザーという設定で考えてみる。
とりあえず学校(Schoolモデル)にコードという項目を追加して、Userモデルでアソシエーションを貼っておく。

User.php
    public $belongsTo = array(
        'School' => array(
            'className' => 'School',
            'foreignKey' => 'school_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
    )

これでどうだろ。
SchoolとUserを紐付けているのはUserテーブル上のschool_idだが、ログインする時はA001みたいな学校コード(これはSchoolテーブル側)を使いたい、ということだと思ってくれ。

で、ビューにフォームを追加。

login_ctp
    <?php
        echo $this->Form->input('School.code', array('label' => array('text' => '学校コード')));
        echo $this->Form->input('username', array('label' => array('text' => 'ユーザーID')));
        echo $this->Form->input('password', array('label' => array('text' => 'パスワード')));
    ?>

こんな感じか。

で。コントローラにbeforeFilterで、

UsersConttoller.php
    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('logout');
        if ($this->request->is('post') && isset($this->request->data['School']['code'])) {
            $code = $this->request->data['School']['code'];
            $this->Auth->authenticate = array(
                'Form' => array('passwordHasher' => 'Blowfish', 'scope' => array('School.code' => $code))
            );
        }
    }

scopeで学校コードを追加する。
Authの設定として、AppController.phpの方で、以下のような指定をしていると思うが、

AppController.php
    public $components = array(
        'Paginator', 'Flash', 'Session', 'Security',
        'Auth' => array(
            'logoutRedirect' => array(
                'controller' => 'users',
                'action' => 'login'
            ),
            'authenticate' => array(
                'Form' => array(
                    'passwordHasher' => 'Blowfish'
                )
            )
        )
    );

それを部分的に上書きしているような感じである。
コントローラ側ではbeforeFilterの中に書くのが味噌だ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away