Cake PHP データベースを利用するACLの使い方1
PHP
CakePHP データベースを利用するACLの使い方2
CakePHP1.2
Cake PHP データベースを利用するACLの使い方1の続きです。
次に、AclとAuthのコンポーネントを読み込むようにしておきます。
これを動作させたいコントローラーに記述すればよいのですが、筆者はアプリケーションの全部で動作させたいので、app_controller.phpに記述し、すべてのコントローラーでこのコンポーネントを読み込むようにしています。
var $components=array('Acl', 'Auth');
それでは、グループとユーザーを登録しましょう。
これは普通にグループmodelの機能、ユーザーmodelの機能を利用して、追加します。groups/add, users/add で追加すればよいのです。
次のグループを作ってみましょう。
groupsテーブル
|id|name|created|updated|
|1|戦士|2011-07-14 19:13:08|2011-07-14 19:13:08|
|2|魔法使い|2011-07-14 19:13:08|2011-07-14 19:13:08|
|3|ホビット|2011-07-14 19:13:08|2011-07-14 19:13:08|
|4|来訪者|2011-07-14 19:13:08|2011-07-14 19:13:08|
次に、これらのグループに属するユーザーを作ります。group_idは上記のIDです。
usersテーブル
|id|name|username|password|group_id|created|updated|
|1|アラゴルン(戦士)|alagorn|*****|1|2011-07-14 19:13:08|2011-07-14 19:13:08|
|2|ガンダルフ(魔法使い)|gandalf|2|*****|2011-07-14 19:13:08|2011-07-14 19:13:08|
|3|フロド(ホビット)|flodo|3|*****|2011-07-14 19:13:08|2011-07-14 19:13:08|
|4|ゴクリ(来訪者)|gokuri|4|*****|2011-07-14 19:13:08|2011-07-14 19:13:08|
これで、グループに紐づけられたユーザーができました。
これが、リクエストをする主体、AROです。
次にACOを登録します。できれば、アプリケーションが完成してからの方がよいでしょう。
というのは、コントローラーのアクションのそれぞれにユーザー権限を付与できますが、アプリケーション開発の途中でこれを付与してしまうと、何かアクションを追加するたびに、ACOとAROの関連をアップデートせねばならず、かなり面倒だからです。
このアプリケーションには次のコントローラーとアクションがあるとします。
- 武器コントローラー(weapons) アクション(index,view,add,edit,delete)
- 指輪コントローラー(rings) アクション(index,view,add,edit,delete)
- 豚の切り身コントローラー(meats) アクション(index,view,add,edit,delete)
- ビールコントローラー(beer) アクション(index,view,add,edit,delete)
これらのコントローラーがアクションに分割されてACOテーブル(acos)に格納されます。
acosのテーブルの内容を人間が見て、操作したり理解するのはほぼ不可能です…。
ここは、自動でCakePHPがやってくれることに任せましょう。
後でACLが動作しない場合、このテーブルにちゃんと登録がされているか、は見ておいた方がよいと思います。
では、ついにAROとACLの関連づけをしましょう!
これをすることにより、たとえば「魔法使いグループには、すべての権限を与える」「武器の操作は戦士しか行えない」などのユーザー権限コントロールが初めてできます。
どこのコントローラーでもよいので、次のようなアクションを作ります。
筆者は、ユーザーコントローラー(users)に、次のような関数を作りました。
//Aclコンポーネントを読み込んでいること function init_permissions() { $group =& $this->User->Group; //魔法使いにはすべての権限を与える $group->id = 2; $this->Acl->allow($group, 'controllers'); //戦士は武器を操作できる $group->id = 1; $this->Acl->allow($group, 'controllers/Weapons'); //などなど後は省略 echo "all done"; exit; }
それで、そのあと上記の関数、Users/init_permissionsを一度実行します。
すると、aros_acosテーブルがアップデートされたのがわかるでしょうか?
なお、上記の例ではグループのみに権限を操作していますが、ユーザー単位、アクション単位でこの権限を設定することができます。
すごいですよね!
aros_acosテーブルも、人間が見て操作するのはとても大変ですがacosテーブルよりはわかりやすいと思います。
Users/init_permissionsは一度利用すればもう利用しないので、コメントアウトなどで消しておきましょう。
ユーザー権限を変更したい場合、グループを追加した場合、アクションを追加した場合などはこの関数を自分でアップデートして、実行しましょう。
CakePHP 公式マニュアルの補助になれば幸いです。