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種類のログイン情報が錯綜することなく処理されます。
コントローラを増やす場合は、各コントローラで上記の設定を行う必要がある点を忘れないように注意!
「Cakephp2のAuthコンポーネントで複数ログイン機能を制御」への1件の返信
[…] http://culdesac.verse.jp/?p=53 […]