当一个动作调用另一个动作时,CakePHP auth组件不起作用

时间:2012-09-22 17:49:39

标签: cakephp authentication

所以我有一个案例,我有一个动作(基于某些条件)翻转到同一个控制器中的另一个动作。

现在,初始动作允许给具有特定角色的人(教练或训练师),但后续动作仅允许教练。

但是,由于他们没有直接访问第二个操作(仅通过中间操作),Auth组件不会阻止它被触发。这是一些代码:

public function isAuthorized($user) {
    switch($this->action) {
        case "bulkAction":
            if ($user['role'] == ('coach' || 'trainer') ) {
                return true;
            }
            break;
        case "bulkDelete":
            if ($user['role'] == 'coach') {
                return true;
            }
            break;
    }
    return parent::isAuthorized($user);
}

public function bulkAction() {
    switch($this->request->data['Action']) {
        case "delete":
            $this->bulkDelete();
            break;
    }
}

再次,当bulkAction将数据发送到bulkDelete操作时,Auth似乎被完全绕过,并且操作将完成。如何确保仍然根据控制器的isAuthorized回调检查其他操作调用的操作?

1 个答案:

答案 0 :(得分:2)

首先关闭一个叫另一个的动作是非常糟糕的设计,不应该这样做。您的所有用户都应该只调用bulkAction($ type = null)操作。使用参数$ type指定类型。所以你的网址就像/ foo / bulkAction / edit / foo / bulkAction / delete等。你的$ type param将收到值“edit”,“delete”等。在控制器中创建各种受保护的方法,其中包含每个方法的功能键入并通过bulkAction根据需要调用它们。然后在你的isAuthorised()方法中通过检查用户角色和$ this-> request-> params ['pass']中可用的类型返回true或false。如果您愿意,也可以使用命名参数,而不是使用参数,因此操作将使用bulkAction(),您的网址将类似于/ foo / bulkAction / type:delete。在这种情况下,您可以使用$ this-> request-> params ['named']来获取类型。