我使用cakephp 4与授权2插件。我有一个政策,检查用户是否有一个“管理员”的角色。
当用户在应用程序上被标识时,它工作得很好=〉身份被设置。
但当用户未被识别=〉identity为null时
对策略的调用返回错误:
Argument 1 passed to App\Policy\UserPolicy::canAdminAccess() must be an instance of Authorization\IdentityInterface, null given
策略功能:($user在未标识时为空)
public function canAdminAccess(IdentityInterface $user)
{
return (bool)($user->group_id === 1);
return false;
}
和调入控制器:
public function beforeFilter(EventInterface $event)
{
parent::beforeFilter($event);
$this->Authorization->authorize($this->user,'adminAccess');
}
有什么办法解决这个问题吗?
谢谢
2条答案
按热度按时间vql8enpb1#
授权取决于身份验证,当用户没有通过身份验证时,通常就没有必要让他们继续进行授权检查。
我建议您考虑将身份验证组件的
identityCheckEvent
选项从默认的Controller.startup
(在Controller::beforeFilter()
之后 * 发生 *)更改为Controller.initialize
(这是调用Controller::beforeFilter()
的内容):这将检查组件的
beforeFilter()
回调中的标识,该组件在控制器的beforeFilter()
回调之前被调用。或者,您可以在
beforeFilter()
方法中自己检查标识:请注意,对于那些应该允许在没有身份验证的情况下访问的操作,您需要确保既不应用身份验证检查,也不应用授权检查!
此时,您可能还想问问自己,将公共端点与受保护端点分开是否有意义,例如,将它们放在单独的控制器和/或前缀中,以便您可以仅在受保护端点上应用身份验证/授权中间件,而不对公共端点进行任何身份验证/授权检查。
另请参阅
*身份验证操作手册〉身份验证组件〉配置自动身份检查
sf6xfgos2#
传递给App\Policy\UserPolicy::canAdminAccess()的参数1必须是Authorization\IdentityInterface的示例,给定的为空值
您在何处以及如何定义
$user
属性?