データベース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/' ; 
        }
    }

?>