0

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

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

但是,因为他们没有直接访问第二个操作(仅通过中间操作),所以 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 回调进行检查?

4

1 回答 1

2

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

于 2012-09-22T20:43:27.970 回答