cakephpでアクション別にアクセス権を設定してみた

2012年11月18日日曜日
  • このエントリーをはてなブックマークに追加

Cakephp 2.2.1

ちょっと簡単なACLを以前実装してみてたのでその手順を。 コントローラーのアクション別にACLを割り当てる内容です。

acl.iniも同じ要領だと思いますが想像です。

app/Config/core.php

Configure::write('Acl.classname', 'PhpAcl');

app/Config/acl.php

初期でこういう記述があります。

$config['map'] = array(
    'User' => 'User/username',
    'Role' => 'User/group_id',
);
$config['alias'] = array(
    'Role/4' => 'Role/editor',
);
$config['roles'] = array(
    'Role/admin' => null,
);
$config['rules'] = array(
    'allow' => array(
        '*' => 'Role/admin',
    ),
    'deny' => array(),
);
  • $config['map']
       'User/username' はユーザーモデルのusernameカラムを
       'User/group_id' はユーザーモデルのgroup_idカラムを
  • $config['alias']
    ここはスルーしてしまいました
  • $config['roles']
    権限を階層的に?

  • $config['rules']
    ここで設定するだけで!

と、いうわけでこんな設定にしました。

$config['map'] = array(
    'User' => 'User/mailaddress',
    'Role' => 'User/role',
);
$config['roles'] = array(
    'Role/admin' => null,
    'Role/staff' => null,
);
$config['rules']['allow'] = array(
    '/*' => 'Role/admin',
    '/pages/display' => 'Role/staff',
    '/users/logout' => 'Role/staff',
    '/posts/index' => 'Role/staff',
    '/posts/search' => 'Role/staff',
    '/posts/edit' => 'Role/staff',
    '/posts/history' => 'Role/staff',
    '/posts/view' => 'Role/staff',
    '/users/profile' => 'Role/staff',
    '/users/changepassword' => 'Role/staff',
);

まずDBにroleというカラムを追加しました。 ここには admin または staff という値が入ってます そして、スタッフのユーザーにはallowのアクションだけ許可するようにしてます。 逆にdenyでダメなアクションだけも有りかもしれません。

そしてコントローラー

AppController.php

public $components = array('Acl','Auth');
public function beforeFilter(){
    if($this->Auth->loggedIn()){
        $check_resource = $this->request->controller.DS.$this->request->action;
        if(!$this->Acl->check(AuthComponent::user(),$check_resource)){
            throw new MethodNotAllowedException();
        }
        if(AuthComponent::user('role')=='staff'){
            $this->layout = 'staff';
        }
    }
}

ログイン中ならURLでACLチェック!

ちょっとした権限を付けたい時はいかかでしょうか。

$config['roles']を上手く使えば階層的なアクセス権もいけるんじゃないかと。

そのうち掘り下げたいと思います。

ラベル:


0 件のコメント:

コメントを投稿