ログイン認証で、普通は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の中に書くのが味噌だ。