ホーム > 詳細

CakePHPのACLを理解する(Authコンポーネントから探る) その2

固定リンク:#0000000099   投稿者: ZiSTA 日付:2009-12-30 13:52:17   コメント( 1

前回ACLの利用方法には「アクション・モード」と「CRUD・モード」の使い方があると説明しました。「アクション・モード」と「CRUD・モード」とはAuthコンポーネントの$authorizeプロパティを'actions'または'crud'のどちらにセットするかで決定します。


AuthコンポーネントがAclコンポーネントを「アクション・モード」と「CRUD・モード」それぞれの場合にどのように使ってパーミッションをチェックしているかを見て理解してみます。実際のパーミッションをチェック方法が分かるとACOに何を登録するのか、どのようにパーミッションを設定するのかが見えてきます。


Authコンポーネントは次のいずれかのコードでAclコンポーネントのcheckメソッドを使っている事が分かります。checkメソッドに渡す引数が微妙に異なっている点に注意して下さい。どちらのコードが呼ばれるかは、Authコンポーネントの$authorizeプロパティが'actions'または'crud'のどちらにセットされているかによって決定されます。この$authorizeプロパティがモードの選択なのです。


$authorizeプロパティが'actions'の場合:アクション・モードでチェックしている。

$valid = $this->Acl->check($user, $this->action());

$authorizeプロパティが'crud'の場合:CRUD・モードでチェックしている

$valid = $this->Acl->check(
                        $user,
                        $this->action(':controller'),
                        $this->actionMap[$this->params['action']]
                    );

ここでAclコンポーネントのcheckメソッドも確認しています。1番目の引数がARO、2番目の引数がACOです。3番目の引数はアクションのパーミッションの種類(Create, Read, Update, Delete)です。

$Acl->check($aro, $aco, $action);

AuthコンポーネントがAclコンポーネントのcheckメソッドをどのように使っているかより詳しく見てみます。


1番目のAROにあたる引数は、Authコンポーネントを使ってログインしたユーザーになります。ユーザあるいはユーザーの所属するグループに対してパーミッションがチェックされます。


2番目のACOにあたる引数は、Authコンポーネントは自身のaction()メソッドを呼びその返り値です。このaction()メソッドの返り値に対応するオブジェクトがACOにも登録されていなければならない事になります。ACOに何を登録すべきかを知る大きな手がかりです。またどちらのモードを利用しているかによってaction()メソッドを呼び出す時の引数が違う事も分かります。


それではAuthコンポーネントはaction()メソッドによってどのような値を取得しているのでしょうか。それはコントローラ名とアクション名(アクション・モード・モード)、あるいはコントローラー名(CRUD・モード)です。


アクション・モードの場合:
 '/$actionPath/コントローラ名/アクション名/'
CRUD・モードの場合:
 '/$actionPath/コントローラ名/'


CRUD・モードの場合、アクション名をACOに登録する必要がない事が分かります。


3番目の引数はアクション・モードの時には利用されずCRUD・モードと時にだけ利用されている事が分かります。これはアクション・モードの時には指定されたACOへのアクセスが許可されているどうかかだけをチェックしています。一方CRUD・モードの時には現在のアクションが持つパーミッションのCRUDの種類(Create, Read, Update, Deleteのいずれか)に許可されているかをチェックしています。例えば'view' アクションのCRUDの種類は 'read'になります。現在のアクションがどのCRUDの種類に該当するかはAuthコンポーネントのactionMap属性に事前に設定しておきます。(Aclコンポーネントではありません)ちなみに初期値として('index'=> 'read','add'=> 'create','edit'=> 'update','view'=> 'read','remove'=>'delete')が登録されています。


アクション・モードの場合、CRUDの種類という考え方は利用出来ません。


2つのモードでのcheckメソッドの2番目と3番目の引数の使われ方の違いを理解すると、事前のACOに登録する内容が異なり、パーミッションを割り当てる方法も違う事が分かると思います。どちらのモードを使うかによって事前に準備する作業も異なるのです。


まとめ
アクション・モードは特定のアクションに対して許可あるは拒否をチェックする方法で、CRUD・モードは特定のコントローラーのCRUDの種類でパーミッションをチェックする方法です。


アクション・モード:
 特定のアクションに対して許可あるは拒否をチェックする方法
 ACOにコントローラとアクションの両方を登録する
 パーミッションはACOに対して許可あるいは拒否のいずれかを割り当てる
 (Acl->allow( $aro, $aco)、またはdeny( $aro, $aco))


CRUD・モード:
 コントローラーに対してパーミッションの種類でチェックする方法
 ACOにコントローラーのみ登録する
 コントローラー内のアクションをCRUDのいずれに該当するか設定しておく(AuthコンポーネントのactionMap属性)
 パーミッションはACOに対するCRUDそれぞれについて割り当てる
 (Acl->allow( $aro, $aco,'create')、Acl->allow( $aro, $aco,'edit')など)


これらをふまえた上でAclコンポーネントの公式マニュアルとを読み返してみると見て下さい。もう一度紹介します。

CakePHPのマニュアルの5.1 アクセス制御リストは'CRUDモード'による利用例で、10.2 ACL を制御するシンプルなアプリケーションはアクション・モードによる利用例に基づいて説明されています。

 

コメント

Cake どのマニュアルを読んでもACLの入れ方がよく判らず失敗の連続で苦心してたのですが、
なぜこんなに分かりずらいのかがわかりました・・・

この記事のおかげで、なんとかACL入れられました。
ありがとうございました
2009.12.04 17:08
↑ ページトップ