アクセス制御リスト

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の使い方が若干異なる事を意味しています。

CakePHP Note (v1.3)

Index