问题描述
我正在寻找如何使用新的 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) 在控制器被实例化之前发生.
另见