CakePHPのacl.phpとacl.ini.php
はじめに
CakePHP Advent Calendar 2012 7日目の記事です。昨日は@tkykmwさんの「CandyCaneをHerokuにインストールする」でした。 Heroku使いたいと思いました!
さて、ネタは何にしようと思いつつacl.phpを改めて見てみようと思いたってのエントリー。
以外に(?)情報が少ない気もしますがどうなの!使われてるの?とか思いながら書いてます。
データベースは使わないで簡単に権限管理したいと思ったのがきっかけではありますが…
以下よく出てくる単語です。
ARO(Access Request Object ) – ユーザーやグループ
ACO(Access Controll Ojbect) – アクセス権の対象
この記事では
ARO –> ユーザーのロール
ACO –> コントローラーのアクション
として書いてます。
acl.phpのExampleに使い方が載ってますけども!
aclを使うには
Config/core.php225行目付近
Configure::write('Acl.classname', 'DbAcl');※デフォルトではデータベースですが
Configure::write('Acl.database', 'default');
Configure::write('Acl.classname', 'PhpAcl');とか、
Configure::write('Acl.classname', 'IniAcl');はたまた自作するとか
Configure::write('Acl.classname', 'MyAcl');AclInterfaceを継承したクラスで自作の定義も作れますね。
Controller/AppController.php
public $components = array('Acl','Auth');これだけで使う準備はできました。なんて簡単!
acl.php
デフォルトの定義は下記の様にあります### 1.map
$config['map'] = array(
'User' => 'User/username',
'Role' => 'User/group_id',
);
### 2.alias
$config['alias'] = array(
'Role/4' => 'Role/editor',
);
### 3.role
$config['roles'] = array(
'Role/admin' => null,
);
### 4.rules
$config['rules'] = array(
'allow' => array(
'*' => 'Role/admin',
),
'deny' => array(),
);
1.map
UserにはUserモデルのusernameカラムを使います。RoleにはUserモデルのgroup_idカラムを使います。
2.alias
例えば上のRole/4はUserのgroup_idが4の場合はRole/editorとして扱われます。例えば既存の権限がないシステムに権限を入れたい時は、
$config['map'] = array(userのid=1はadminとして、id=2はeditorとして権限設定できます。
'User' => 'User/id',
);
$config['alias'] = array(
'User/1' => 'Role/admin',
'User/2' => 'Role/editor',
);
3.role
'Role/manager' => 'Role/admin'マネージャーは管理者を継承してます。
継承はカンマ区切りで複数登録可能。
Component/Acl/PhpAcl.phpを見てたら Hash::flatternで展開してました。
多次元配列を配列にするHash::flattern使えそう!
http://book.cakephp.org/2.0/en/core-utility-libraries/hash.html#Hash::flatten
4.rules
実際に許可するURLを指定します'allow' => array(上記の例では、
'*' => 'Role/admin',
'controllers/users/logout' =>array('Role/editor','Role/viewer'), //配列でも
'controllers/posts/index' =>'Role/editor,Role/viewer', //カンマ区切りでも
'controllers/posts/view' =>'Role/editor,Role/viewer',
'controllers/posts/add' =>'Role/editor',
'controllers/posts/edit' =>'Role/editor',
),
'deny' => array(
'controllers/users/delete' =>'Role/manager',
),
- 管理者 = 全部OK
- 編集者 = 投稿の一覧閲覧と編集、追加OK
- 閲覧者 = 投稿の閲覧OK
- マネージャー = ユーザーの削除だけダメ
実際に使ってみる
Controller/AppController.phpclass AppController extends Controller {
public $components = array(
'Session','Acl','Auth',
);
public function beforeFilter(){
$this->Auth->authorize = array('Actions' => array('actionPath' => 'controllers/'));
}
}
acl.iniの場合
ちょっと記述の仕方が違います。デフォルトではusernameというカラムの情報を使うようです。
lib/Cake/Controller/Component/Acl/IniAcl.php
public $userPath = 'User.username';[管理者の名前] groups = admin
groupsにadminを指定すると、
[admin] allow = deny = を比較します。
[管理者の名前] allow = deny = だけでもOK。両方指定してもOK
ただ、グループ名とユーザー名はかぶっちゃダメ!と書いてますね
acl.phpと同じようにしてみる
$this->Auth->authorize->Actionsの場合ですね。public $userPath = 'User.role'; //今回は書き換えました。[admin] groups = 管理者グループ
[管理者グループ] allow = controllers/Users/logout,….
[閲覧グループ] allow = controllers/Users/logout,controllers/Posts/index,controllers/Posts/view
などなど、中はarray_searchで比較してたので大文字でないとFalseでした。
admin *は使えないんですね。。。
終わりに
今回の検証に使ったソースはこちらにhttps://github.com/ootatter/cake-acl-sample 置いてます。個人的にAcl.phpのほうが柔軟に対応できて使いやすそうだなと思いました。 alias とか。
ちょっとだけ権限入れたいとき、ユーザーは多くないけど今のシステムに権限つけたい時とかに如何でしょうか
CakePHP Advent Calendar、明日は@junichi11さんの担当です。