baserCMSでは、ユーザーグループ別に、機能単位や画面単位でアクセス制限を設けて、不要なメニュー表示を調整したり、余分な機能を扱わせないようにすることで、管理システム利用者にとってシンプルで扱い易い管理システムを提供することができます。
- アクセス制限設定の一覧画面URL例: /admin/permissions/index/2
- システムナビ → ユーザーグループ一覧 → ユーザーグループの鍵アイコンへアクセス
このアクセス制限設定は、ユーザーグループ単位となっているため、ユーザー単位で調整するには少しカスタマイズが必要です。
イベント処理使って調整できます。
必要な状況
- baserCMSのアクセス制限設定を、ユーザー単位で調整入れたいとき
- 例: Aグループでは固定ページ機能を許可するが、Aグループ内のhogeユーザーには許可したくない場面
前提条件
- ユーザーグループでのアクセス制限設定の調整を行っていることが前提
- 紹介しているやり方はプラグイン・イベント
ファイルの作成
プラグイン内に ModelEventListener 作ります。
- /app/Plugin/HogePlugin/Event/HogeModelEventListener.php
<?php
/**
* [ModelEventListener] Hoge
*
*/
class HogeModelEventListener extends BcModelEventListener {
/**
* 登録イベント
*
* @var array
*/
public $events = array(
'Permission.afterFind',
);
/**
* permissionBeforeFind
* ユーザーIDが2のユーザーでは固定ページ管理へのアクセスを不可にする
*
* @param CakeEvent $event
*/
public function permissionAfterFind(CakeEvent $event) {
$Model = $event->subject();
if (BcUtil::isAdminSystem()) {
$user = BcUtil::loginUser();
if ($user['id'] == '2') {
foreach ($event->data[0] as $key => $permission) {
if ($permission['Permission']['url'] == '/admin/pages/*') {
$event->data[0][$key]['Permission']['auth'] = false;
}
}
}
}
}
}
何をやっているの?
アクセス制限設定は、/lib/Baser/Controller/BcAppController.php の beforeFilter() でチェックされており、beforeFileter() では、Permissionモデルの check() が走ってます。
check() では、ログイン中ユーザーのユーザーグループIDから、そのユーザーグループのアクセス制限設定の全データを取得してます。
そのため、find したあとのタイミングを利用して、ユーザーIDをもとに、取得したアクセス制限設定の中身を書換えることで、任意のユーザーIDのアクセス制限を設けることを実現してます。
その他のアプローチ
- ID判定じゃなくても、ユーザーアカウント名での判定でも良い
- 権限設定の1行分のデータを配列で作成して追加するやり方でも良い(けど、グループで既に設定済みのを使う方がラクだよね)
あとがき
Qiita載っけときます丶(・ω・)ノ
→ http://qiita.com/materializing/items/e37f570056d29741090b