Cakephp2のAuthコンポーネントで複数ログイン機能を制御

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種類のログイン情報が錯綜することなく処理されます。

コントローラを増やす場合は、各コントローラで上記の設定を行う必要がある点を忘れないように注意!

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください