cakephp授权错误,没有标识

nfeuvbwi  于 2022-11-12  发布在  PHP
关注(0)|答案(2)|浏览(123)

我使用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');
    }

有什么办法解决这个问题吗?
谢谢

vql8enpb

vql8enpb1#

授权取决于身份验证,当用户没有通过身份验证时,通常就没有必要让他们继续进行授权检查。
我建议您考虑将身份验证组件的identityCheckEvent选项从默认的Controller.startup(在Controller::beforeFilter()之后 * 发生 *)更改为Controller.initialize(这是调用Controller::beforeFilter()的内容):

$this->loadComponent('Authentication.Authentication', [
    'identityCheckEvent' => 'Controller.initialize',
]);

这将检查组件的beforeFilter()回调中的标识,该组件在控制器的beforeFilter()回调之前被调用。
或者,您可以在beforeFilter()方法中自己检查标识:

// ...

if (!$this->Authentication->getIdentity()) {
    throw new UnauthenticatedException(
        $this->Authentication->getConfig('unauthenticatedMessage', '')
    );
}

// ...

$this->Authorization->authorize($this->user, 'adminAccess');

请注意,对于那些应该允许在没有身份验证的情况下访问的操作,您需要确保既不应用身份验证检查,也不应用授权检查!

$unauthenticatedAllowed = in_array(
    $this->request->getParam('action'),
    $this->Authentication->getUnauthenticatedActions(),
    true
);

// ...

if (!$unauthenticatedAllowed) {
    if (!$this->Authentication->getIdentity()) {
        throw new UnauthenticatedException(
            $this->Authentication->getConfig('unauthenticatedMessage', '')
        );
    }

    // ...

    $this->Authorization->authorize($this->user, 'adminAccess');
}

此时,您可能还想问问自己,将公共端点与受保护端点分开是否有意义,例如,将它们放在单独的控制器和/或前缀中,以便您可以仅在受保护端点上应用身份验证/授权中间件,而不对公共端点进行任何身份验证/授权检查。
另请参阅

*身份验证操作手册〉身份验证组件〉配置自动身份检查

sf6xfgos

sf6xfgos2#

传递给App\Policy\UserPolicy::canAdminAccess()的参数1必须是Authorization\IdentityInterface的示例,给定的为空值
您在何处以及如何定义$user属性?

public function beforeFilter(EventInterface $event)
    {
        parent::beforeFilter($event);
        debug($this->user); // what is output ??
        //$this->Authorization->authorize($this->user,'adminAccess');

        // to fix, try
        $user = $this->Authentication->getIdentity()->getOriginalData();
        $this->Authorization->authorize($user,'adminAccess');
    }

相关问题