CakePhp4 使用新的身份验证和授权插件实现已弃用的 Controller::isAuthorized()

问题描述

我正在寻找如何使用新的 Controller::isAuthorized()Authentication 插件实现已弃用的 Authorization,但我找不到方法

例如,在 RequestPolicyInterface::canAccess() 调用方法 RequestAuthorizationMiddleware 中,我无法获取当前控制器的实例。

有什么想法吗??

谢谢。

解决方法

策略适用于和接收资源,请求策略适用于请求,并将相应地接收当前请求对象,此外还有策略始终接收的当前身份。

本例中 canAccess 方法的具体签名为:

canAccess(\Authorization\IdentityInterface $identity,\Cake\Http\ServerRequest $request)

例如,该方法会在第二个参数中接收当前请求,您可以从请求参数中获取路由信息::

public function canAccess($identity,ServerRequest $request)
{
    if (
        !$request->getParam('plugin') &&
        !$request->getParam('prefix') &&
        $request->getParam('controller') === 'Articles'
    ) {
        return $identity->role->name === 'admin';
    }

    return true;
}

这将只允许具有角色 admin 的用户访问(非插件/带前缀的)Articles 控制器,并允许任何人访问所有其他控制器。

请注意,您将不会收到控制器的实例,因为该特定检查是 a) 不是针对控制器对象而是针对请求对象进行的,并且 b) 在控制器被实例化之前发生.

另见

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...