データベースACL利用時のプラグインコントローラへのアクセス制御方法
Cake のデータベースACLについて勉強するべく、CookBookにある開発例 『http://book.cakephp.org/ja/view/641/Simple-Acl-controlled-Application』 を試してみました。
実際にやってみて、『プラグインコントローラへのアクセス制御はどうすれば?』という疑問が沸いてきたので調べてみました。
準備
上記の開発例に従ってセットアップした後に、CookBookにあるプラグイン作成のサンプルである『ピザ注文プラグイン』を作成した状態を前提として説明を行います。
http://book.cakephp.org/ja/view/115/Creating-a-Plugin
アクセス制御方法
プラグイン毎にトップレベルのACOを用意してあげることで制御ができます。
まず、acosテーブルに新たなトップレベルのACOとして、"pizza_plugins"を追加して、その子ノードとしてPizzaOrdersController関連のACOを追加します。(aros_acosテーブルに追加したACOのパーミッション設定も必要)
acosテーブル +----+-----------+-------+-------------+---------------+------+------+ | id | parent_id | model | foreign_key | alias | lft | rght | +----+-----------+-------+-------------+---------------+------+------+ | 1 | NULL | | | controllers | 1 | 58 | | 2 | 1 | | | Pages | 2 | 5 | | 3 | 2 | | | display | 3 | 4 | 〜〜 省略 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 | 30 | NULL | | | pizza_plugins | 59 | 64 | ← 新しいトップレベルのACO | 31 | 30 | | | PizzaOrders | 60 | 63 | ← pizza_pluginsが親ノード | 32 | 31 | | | index | 61 | 62 | ← PizzaOrdersが親ノード +----+-----------+-------+-------------+---------------+------+------+
そしてAppController::beforeFilter()内で、「通常のコントローラへのアクセス」と「プラグインコントローラへのアクセス」を振り分け、それぞれのトップレベルのACOをAuthComponentにセットしてあげれば、正しくアクセス制御が行われます。
<?php function beforeFilter() { $this->Auth->authorize = 'actions'; $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login'); $this->Auth->loginRedirect = array('controller' => 'pages', 'action' => 'display'); if( empty($this->plugin) ) { $this->Auth->actionPath = 'controllers/'; } else { // トップレベルのACOは プラグイン名 + '_plugins' $this->Auth->actionPath = $this->plugin . '_plugins/' ; } } ?>