根据CakePHP 3中的角色授权用户

时间:2016-09-22 17:35:14

标签: php cakephp cakephp-3.x

我想根据几个角色授权用户。所有访客都应该能够到达方法节目。所以我在AppController中写道:

public function beforeFilter(Event $event) {
    $this->Auth->allow(['show']);
}

有效。

在AppController的initialize()方法中我也得到了:

$this->loadComponent('Auth', [
    'authorize' => 'Controller'
]);

我想允许具有角色"用户"的已登录用户达到所有"索引","添加"方法,所以我在AppController中写道:

public function isAuthorized($user) {
if (isset($user['role']) && $user['role'] === 'admin') {
return true;
}
if (isset($user['role']) && $user['role'] === 'user') {
$this->Auth->allow(['index', 'logout', 'add']);
}

return false;
}

管理员可以按预期访问所有方法。用户使用角色" user"无法达到" index"或者"添加"方法。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:11)

不要使用您的逻辑添加额外的Auth允许,只需使用逻辑通过检查操作来确定他们是否在允许的操作中,如果他们已获得授权,则返回true

public function isAuthorized($user) {

    // Admin allowed anywhere
    if (isset($user['role']) && $user['role'] === 'admin') {
        return true;
    }

    // 'user' allowed in specific actions
    if (isset($user['role']) && $user['role'] === 'user') {

        $allowedActions = ['index', 'logout', 'add'];
        if(in_array($this->request->action, $allowedActions)) {
            return true;
        }

    }
    return false;
}

(显然这段代码可以根据自己的喜好缩短,但它显示了这个概念)

答案 1 :(得分:0)

我发现此解决方案很棒且易于维护。

//in all controllers that you want to restrict access
public function isAuthorized($user)
{
    //an array since we might want to add additional roles
    $possibleRoles = array('admin');
    return $this->confirmAuth($user['role'], $possibleRoles);
}

//in AppController
public function confirmAuth($userRole, $allowedRoles)
{
    return in_array($userRole, $allowedRoles);
}