CakePHP データベースを利用するACLの使い方
ログインを必要とするWebアプリケーションのニーズは非常に多いでしょう。
ログインをCake PHPではACL(Access Control List)という方法で細かく制御できます。
本家のマニュアルサイトでは説明が分かりにくかったので書いておきます。
【参考】
[[Defining Permissions: Cake’s Database ACL:
http://book.cakephp.org/view/467/Defining-Permissions-Cake-s-Database-ACL]]
Simple Acl controlled Application
まず、ACOとAROという単語を理解します。
- ACO=Access Control Object アクセスを求められる機能など
たとえば、ブログの投稿機能、削除機能、編集機能などのような機能が多く考えられます。
- ARO=Access Request Object
多いケースは、ユーザーです。一般ユーザーだったり、管理者だったり、というような区分けがあるでしょう。
それでは、ユーザーとグループを作りましょう。
ユーザーは数が多いので、グループを作るのが一般的です。
本家マニュアルサイトに習い、「指輪物語」のキャラクターで考えてみます。
(指輪物語について知らないと理解が難しいかもしれませんが(^_^;)
Fellowship of the Ring™(指輪物語)
* 戦士 o アラゴルン o レゴラス o ギムリ * 魔法使い o ガンダルフ * ホビット o フロド o ビルボ o メリー o ピピン * 訪問者 o ゴラム
上記では、ユーザーがアラゴルンやレゴラスで、戦士や魔法使い、がグループです。
指輪物語的なCRUD(Create, Read, Update, Delete)アプリケーションができあがっていて、これからユーザー認証を加えるという前提です。
グループのテーブル(Groups)を作り、ユーザーのテーブル(Users)に所属するGroupIDを入れましょう。
ユーザーのモデル(user.php)に次のように記述します。
var $belongsTo = array( 'Group' => array( 'className' => 'Group', 'foreignKey' => 'group_id', 'conditions' => '', 'fields' => '', 'order' => '' ) );
グループのモデル(group.php)に次のように記述します。
var $hasMany = array( 'User' => array( 'className' => 'User', 'foreignKey' => 'group_id', 'dependent' => false, 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'exclusive' => '', 'finderQuery' => '', 'counterQuery' => '' ) );
ユーザーはグループにblongsToで、グループはユーザーに対してhasManyという関係です。
(データベースのテーブルも、そのように作っておきます。)
ここまでできたら、ケーキのコンソールから、次のようにコマンドを打ちます。
cake schema run create DbAcl
(cake)の部分は、cake.batなどを動かす部分です。
すみません、ちゃんと全部解説するつもりでしたが、途中で終わっていました。
役に立たなかったの声にお応えして(^_^;、続きを記載しておきます。
cake schema run create DbAcl
を進めていくと、aros, acos, aros_acos, という3つのテーブルができると思います。
aros, acos, aros_acos というテーブルの中身については、データベースを利用するログインに必要なものですが、とりあえず気にしないで次に進みましょう。
Cake PHP データベースを利用するACLの使い方2