アクセス制御リスト
- ACLを使う事は、次のようなプログラミングをしてゆく事になります。
- 準備:テーブルの作成
- AROオブジェクトの登録
- ACOオブジェクトの登録
- メソッド
- AclBehavior
- AuthComponent
ACL(アクセス制御リスト)を扱うコンポーネント。ファイルあるいはデータベースで管理します。ユーザー管理やログイン/ログアウトなどユーザー認証などは別途用意する必要があります。(ユーザー認証に関してはAuthComponentを使うと便利です。)
ACLは、AROのACOに対するアクセス権限を管理する仕組みです。AROとACOはツリー状の階層構造で管理できます。
- ARO(アクセスリクエストオブジェクト:アクセスの要求主。ユーザーやグループなど)
- ACO(アクセスコントロールオブジェクト:アクセスを制限したい対象。コントローラーやアクションなど)
ACLを使う事は、次のようなプログラミングをしてゆく事になります。
- AROとACOの各ACLオブジェクトを登録する(データベースまたはファイル)
- ACLノード間のアクセス権を設定する
- アクセス権のチェックを行う
準備:テーブルの作成
コンソールで以下のコマンドを実行すると必要なテーブルを作成できます。(app/config/sql/db_acl.sqlのSQLを実行する事と同じです。)
cake schema run create DbAcl
実行するとrosテーブルとacosテーブル、そしてaros_acosテーブルが作成されます。
arosテーブルは親ノードのIDのほかモデル名とレコードID(foregnk_ey)、エリアス名(Alias)とで構成されます。
acosテーブルも同様です。
aros_acosテーブルはAROとACOを関連づける中間テーブルです。またACOに対する権限をCRUD(create,read,update,delete)で指定する役割も持っています。
AROオブジェクトの登録
AROオブジェクトを登録する仕組みを作って、AROオブジェクトを登録してゆきます。AclBehaviorを使ってユーザーを登録するとそのユーザーを示すAROオブジェクトが自動でACLに登録されるようにすると便利です。
コンソールでACLを管理する事ができます。初期データの登録等に便利です。ヘルプでコマンドの説明もあります。
cake acl help
コンソールでAROを作成するコマンドの書式。
cake acl create aro <parent> <node>
<parent>をツリーのルートにする場合は'root'または'/'と指定する。
<parent>と<node>は次のいずれかで指定する。
<model>.<id>で特定テーブルの特定レコードIDを指定。
<alias>でエリアス名を指定する。
ACOオブジェクトの登録
色々なものをACOオブジェクトとして扱う事ができますが、作成しているアプリケーションのコントローラとアクションをACOとして登録する方法が考えられます。さらにコントローラとアクションの2種類のACOオブジェクトを登録するやり方とコントローラのみACOオブジェクトを登録するやり方があります。これらはAuthコンポーネントとの併用も考えられています。とても便利な反面ACLの理解をややこしくしている原因になっています。Authコンポーネントの設定用キーにならって前者をACTIONモード、もう一方をCRUDモードを呼ぶ事にします。
ACTIONモード
- コントローラとアクションの2種類のACOオブジェクトを登録する
- アクセス権限は許可あるいは拒否のいずれかを設定する
- 単純にURL毎のアクセス権を設定するような方法です。
- アクセス権のチェック方法:Acl->check($user,'controller/action');
CRUDモード
- コントローラのACOオブジェクトを登録する
- アクセス権限はCRUD(create,read,update,delete)のそれぞれについて許可あるいは拒否を指定する
- アクションはAuthコンポーネントでCRUDにマップしておく。(例:index=>read,edit=>update)
- URLをCRUDのいずれかに分類しアクセス権を設定する方法です。
- アクセス権のチェック方法:Acl->check($user,'controller','read');
メソッド
- check($aro,$aco,$action='*')
AROのACOに対する権限をチェック。$aro,$acoはnode()メソッドで特定できるものを指定(aro,acoオブジェクト、aro,acoノードのパス、モデルオブジェクト、データの配列)$actionはCRUD(create,read,update,delete)または全てを表す'*'。
AclBehavior
ACLビヘイビアを併用するとユーザーを登録した時に自動的にAROも追加するといったような事もできます。
AuthComponent
AuthコンポーネントとACLコンポーネントを組み合わせて使うと、ユーザー認証とACLのチェックを一括して行なわせる事ができます。AuthコンポーネントからACLのチェックを行なわせるには、$authorize属性を'action'または'crud'にセットします。
'action'に設定した場合はAcoノード('actionPath/controller/action)に対するアセセスがチェックされます。
$this->Acl->check($user, $this->action());
'crud'に設定した場合はAcoノード('actionPath/controller/)に対するアセセス(crud)がチェックされます。
$this->Acl->check($user,$this->action(':controller'),this->actionMap[$this->params['action']])
検索されるAcoノードが違う事に注意して下さい。ACLの使い方が若干異なる事を意味しています。