CakePHP2による開発で、何種類かのログイン機能を一つのウェブサービスに実装したい場合のお話し。
たとえば管理者用機能と一般ユーザーでのログイン状態の切り分けや、一つのサイト内で別のサービスを立ち上げて2種類以上のユーザーを抱えるような場合、aclによる制御も一つの方法ですが、そこまで厳密にユーザー権限を管理する必要は無いケースも多々あるはず。
単純にユーザーテーブルとloginメソッド実装したコントローラーを複数用意して、「ログイン出来たー!」と思ったらログイン情報が錯綜してしまい、あっちの機能でログインしたら、こっちの機能のログイン状態がおかしくなった...。
という場合の対処方法。
簡単な話で、各コントローラごとにログインを管理するグループに合わせてAuthComponentのセッションキーを変えればOK。
たとえば管理者機能(Adminグループ)のログインと、一般ユーザー(Userグループ)でのログイン機能の2種類がある場合、Authコンポーネントで用いるユーザー用テーブルを2種類用意する。
#管理者ユーザーテーブル
CREATE TABLE `admins` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`password` varchar(45) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#一般ユーザーテーブル
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`password` varchar(45) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
当然対応するAdminModelとUserModelは作成するとして、コントローラも2種類(管理者用機能と一般ユーザー用機能)を用意する必要がある。
各コントローラでAuthコンポーネントを設定する時に、
- ログインに使用するモデルをグループに合わせて指定
- beforeFilterで各グループごとに個別のsessionKeyを指定
これだけで、狙ったユーザーグループを用いたログイン機能が実現できる。
//AdminsController
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'fields' => array(
'username' => 'name',
'password' => 'password',
),
'userModel' => 'Admin',
),
),
),
);
public function beforeFilter() {
parent::beforeFilter();
AuthComponent::$sessionKey = 'Auth.admins';
}
//UsersController
public $components = array(
'Auth' => array(
'authenticate' => array(
'Form' => array(
'fields' => array(
'username' => 'name',
'password' => 'password',
),
'userModel' => 'User',
),
),
),
);
public function beforeFilter() {
parent::beforeFilter();
AuthComponent::$sessionKey = 'Auth.users';
}
こんな感じで設定しておけば、あとは通常のCakePHPアプリのようにloginアクションやふつうのアクションを定義していけば、2種類のログイン情報が錯綜することなく処理されます。
コントローラを増やす場合は、各コントローラで上記の設定を行う必要がある点を忘れないように注意!