所以我有一个案例,我有一个动作(基于某些条件)翻转到同一个控制器中的另一个动作。
现在,初始动作允许给具有特定角色的人(教练或训练师),但后续动作仅允许教练。
但是,由于他们没有直接访问第二个操作(仅通过中间操作),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回调检查其他操作调用的操作?
答案 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']来获取类型。