Cake PHP データベースを利用するACLの使い方2

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の関連をアップデートせねばならず、かなり面倒だからです。

このアプリケーションには次のコントローラーとアクションがあるとします。

  1. 武器コントローラー(weapons) アクション(index,view,add,edit,delete)
  2. 指輪コントローラー(rings) アクション(index,view,add,edit,delete)
  3. 豚の切り身コントローラー(meats) アクション(index,view,add,edit,delete)
  4. ビールコントローラー(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 公式マニュアルの補助になれば幸いです。[smile]

カテゴリーPHP

コメントを残す

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