CakePHPのプレフィックスルーティングでアクセス制御を行う

2014年 5月20日 PHP CakePHP

CakePHPではユーザーのロールによるアクセス制御を行うために、Aclコンポーネントが用意されています。
AclコンポーネントではDbAcl、IniAcl、PhpAclの3種類のクラスが用意されていて、
それぞれ、ACLをデータベースに格納、iniファイルに記述、PHPファイルに記述というかんじです。

しかし、CookbookのACLを制御するシンプルなアプリケーションを読むかぎり、制御リストに一個づつcontrollerやactionを指定していくようで、ちょっとめんどくさいです。

そこで、プレフィックスルーティングを使ってアクセス制御を行ってみます。
プレフィックスルーティングとは、コントローラーをbakeするときに「Would you like to create the methods for admin routing?」と聞かれるやつです。
アクセス制御を行いたいURLが/adminとか/manager以下のみの場合は簡単に設定できるので有効です。

今回はroleをadminとmanagerの2つに設定して、/admin以下はadminのみ、/manager以下はmanagerのみがアクセスできるようにします。



認証まわりの設定

認証情報にroleが紐づいていればOKです。
CakeDCのUsersプラグインを使いました。
usesテーブルのroleにadmin、manager、それ以外を設定します。

Routing.prefixesの設定

まず、core.phpに書かれているConfigure::write(‘Routing.prefixes’, array(‘admin’));のコメントアウトを外します。
そしてmanagerを追加します。

php
// app/Config/core.php
 
Configure::write('Routing.prefixes', array('admin', 'manager));

AppControllerの設定

AuthコンポーネントにControllerのisAuthorized()をアクセス制御の前に呼ぶように設定します。

php
// app/Controller/AppController.php
 
public $components = array(
    'Session',
    'Auth' => array(
        'loginRedirect' => array('controller' => 'posts', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'),
        'authorize' => array('Controller') // この行を追加しました
    )
);

isAuthorizedではアクセス先のurlのプレフィックスがroleと一致していればtrueを返し、一致していなければfalseを返すようにします。

php
// app/Controller/AppController.php
 
public function isAuthorized($user) {
    if (isset($this->params['prefix'])) {
        return strcasecmp($this->params['prefix'], $user['role']) === 0;
    }
     
    return false;
}

簡単ですね!



前へ 次へ