Tutorialでのお勉強。

ACL – Access Control List
aro – Access Request Object
aco – Accecc Controll Object

1.サンプルテーブル。これでBakeする。

これで簡易CRUDの完成。

2.ログイン制御の基礎

まずUsersController.phpに以下を追加。

次にView/Users/login.ctpを作成。

そしてapp/Model/User.phpにPWハッシュ化の為に下の様に修正。

その後app/Controller/AppController.phpに下を追加して、ログイン制御。
※チュートリアルにはこう書いてあるのだが、この状態でもログイン出来ないので、初回グループ・ユーザ作成時は以下をコメントアウトすることを推奨。(2.4.2で発生)

GroupsController.php, UsersController.phpに下を追加してアクセス可に。

まだグループ・ユーザは作らない。。

3.Acl用データベースのイニシャライズ

最初にテーブル作成。このコマンドか、

以下のSQLを実行。

そして、グループとユーザの紐付けを行う。
この紐付けにはAclBehaviorを使う。
これを使うため、ユーザモデル内のparentNode()を以下のように定義。

Model/User.php

続いて、グループ。

Model/Group.php

これはグループモデルとユーザーモデルをACLでつなぎ、どちらかを作成・削除した時にはAROテーブルもアップデートする様にしている。

ここまで来たら、グループを作る。

・administrators
・managers
・users

また、それぞれのユーザも作る。

この時、一旦認証を切るために以下をコメント。

・AppController

・UsersController

・GroupsController

 

そして今回はグループ毎に権限を持たせるので、ACLのチェックをグループのaroだけにする。

ユーザモデルに下を追加。

Model/Users.php

4.ACOテーブルへの登録。

テーブルarosはグループ、ユーザの追加時に自動でアップデートされるが、ここではacosをアップデートする。

下のプラグインを使う。

https://github.com/markstory/acl_extras/

こいつを使う場合は、解凍して以下に設置して、
Plugin/AclExtras

app/Config/boostrap.phpに追記。

そしてシェルからコマンド。

これで各ルートの情報がacoテーブルにアップデートされる。
下層をアップデートするには、AclShellを使う。

下が詳しい。
http://book.cakephp.org/2.0/en/console-and-shells/acl-shell.html

例えば、以下のコマンドを打つ。
※もっと簡単な方法がないのだろうか。

5.パーミッションの設定。

userの挙動を制御するaros_acosテーブルのアップデートをおこなう。
ここではシェルを使わずに、AclComponent を使う。

パーミッションの設定の為、一時的に以下を追加する。

Controller/UsersController.php

この状態で、一度ブラウザでusers/initdb へ行く。アクセス前にaros_acosが空な事を確認しよう。
でコメントしてる場合は、コメント解除してからアクセスしよう
アクセス後にaros_acos を見ると、テーブルが更新されていることがわかるはず。それを確認したら、initDBへのアクセスを外す。

この場合のパーミッションはこう。

■管理者(1)
・全てのページの操作・閲覧

■マネージャ(2)
・ポスト・ウィジェットの全ての操作・閲覧

■ユーザ(3)
・ポスト・ウィジェットの追加、編集

aclでindex, viewを指定しないことでこれらはpublicにされている。

次に、Posts,Widgetsは閲覧可能なので、それぞれのコントローラ内 beforeFilter()に以下を追加。

更にAppController::beforeFilter() に以下を追加

あと、先に追加したlogoutメソッドを埋める。

UsersController::logout() に、下記を追加。

これでチュートリアルが完成したと思う。
後は自分で好きなように変更していくだけ!


Leave a Reply

Your email address will not be published. Required fields are marked *