【问题标题】:CakePHP auth component not working when one action calls another当一个动作调用另一个动作时,CakePHP auth 组件不起作用
【发布时间】:2023-03-24 17:07:01
【问题描述】:

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

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

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

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 回调进行检查?

【问题讨论】:

  • 你试过用setAction代替直接调用action方法吗?如果您将以上内容改写为问题,那将是很好的。现在它只是一个声明。
  • 编辑添加实际问题!试过setAction,还是没有骰子。

标签: cakephp authentication


【解决方案1】:

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

【讨论】:

  • 非常感谢。从动作中调用动作总是感觉不对,但是当提交可以做一些事情的表单时(例如,带有复选框的用户列表),我不知道如何实际使用多个动作选项。这有帮助!
  • 其实有点问题。这是来自表单提交,并且有几个按钮可以根据操作提交表单。我正在使用 "array('type'=>'submit', 'name' => 'Action', 'value' => 'delete')" 所以不清楚如何使用 $type 方法。
  • 那么只需在您的 isAuthorised() 中检查 $this->request->data['Action']
  • 有效。嘿,我不会永远是一个n00b! :)
猜你喜欢
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多