Authentication 如何允许未经身份验证的用户查看PHP3中的某些特定页面或操作页面?

Authentication 如何允许未经身份验证的用户查看PHP3中的某些特定页面或操作页面?,authentication,cakephp,plugins,authorization,cakephp-3.8,Authentication,Cakephp,Plugins,Authorization,Cakephp 3.8,在CakePHP3中,我们使用了Auth组件,其工作原理如下 现在我正在尝试使用新的和插件(我不知道这是否是最好的解决方案) 我有这个案子: 数据库中有一些实体表(汽车、品牌和用户)。我有用户和4级用户角色(金字塔)。 -管理员可以改变一切 -编辑可以查看和添加品牌和汽车,但只能编辑或更新自己创建的汽车和品牌。 -注册用户只能添加汽车和编辑他们的汽车(并查看所有汽车和品牌)。 -匿名用户可以查看所有内容,但只能创建用户帐户 身份验证单独工作很好。为了允许匿名用户访问内容,我使用$this->Au

在CakePHP3中,我们使用了Auth组件,其工作原理如下

现在我正在尝试使用新的和插件(我不知道这是否是最好的解决方案)

我有这个案子:

数据库中有一些实体表(汽车、品牌和用户)。我有用户和4级用户角色(金字塔)。 -管理员可以改变一切 -编辑可以查看和添加品牌和汽车,但只能编辑或更新自己创建的汽车和品牌。 -注册用户只能添加汽车和编辑他们的汽车(并查看所有汽车和品牌)。 -匿名用户可以查看所有内容,但只能创建用户帐户

身份验证单独工作很好。为了允许匿名用户访问内容,我使用
$this->Authentication->allowUnauthenticated(['login','add'])但当我加载授权插件时,一切都会出错

是否需要使用authorizeModel和其他功能指定所有授权访问?有没有一种方法可以同时对两个插件进行授权?我真的需要授权插件吗?推荐使用授权插件还是认证插件可以处理

在以前的Auth组件中,我使用了类似以下代码:

在AppController.php中

public function beforeFilter(Event $event)
{
    $this->Auth->allow(['view', 'display']);
}

public function isAuthorized($user)
{
    return true;
}
public function beforeFilter(Event $event)
{
    parent::beforeFilter($event);
    $this->Auth->allow('add', 'logout');
}
在UsersController.php中

public function beforeFilter(Event $event)
{
    $this->Auth->allow(['view', 'display']);
}

public function isAuthorized($user)
{
    return true;
}
public function beforeFilter(Event $event)
{
    parent::beforeFilter($event);
    $this->Auth->allow('add', 'logout');
}
在汽车和品牌控制器中

public function isAuthorized($user)
{
    if (isset($authUser['role']) && $authUser['role'] === 'admin') {
        return true;
    }

    if ($this->request->action === 'add') {
        return true;
    }

    if ($this->request->action === 'index') {
        return true;
    }

    if (in_array($this->request->action, ['edit'])) {
        $carId = (int)$this->request->params['pass'][0];
        if ($this->Cars->exists(['id' => $carId, 'user_id' => $authUser['id']])) {
            return true;
        }
    }

    return false;
}

我的版本是: -CakePHP3.8 -身份验证插件1.4 -授权插件1.3

对不起,如果我的问题有点基本,但文档对此不是很清楚。如果需要,我可以添加更多细节

编辑:如果我退出未经验证的重定向,我会得到:

No identity found. You can skip this check by configuring `requireIdentity` to be `false`.
Authentication\Authenticator\UnauthenticatedException
如果我在AppController中将实体添加为false

        $this->loadComponent('Authentication.Authentication', [
            'requireIdentity' => false
        ]);
我得到(路径在哪里/可以是/汽车/品牌)

如果我在AppController中使用此选项(总是在授权之前进行身份验证)

这一点正在应用中

        $service->setConfig([
            'unauthenticatedRedirect' => \Cake\Routing\Router::url('/users/login'),
            'queryParam' => 'redirect',
        ]);
我将所有用户发送到登录页面,但出现授权检查错误。 使用
$this->Authorization->skipAuthorization()
在beforeFilter()中,用户可以看到页面和作品,但我不知道它是否合适

如果我在任何控制器中使用它,则在过滤器
$this->Authorization->authorizeModel('index','add','display')之前

我明白了

在主页(或页面控制器)中,我得到


我真的需要为每个表创建策略吗?我认为它比以前的Auth组件更复杂,或者可能是我做错了什么。

请添加您收到的错误,并展示您如何尝试使用授权插件。您在哪里进行
allowUnauthenticated
调用?我在加载身份验证插件之后和加载授权之前立即获得了它。不确定这是否是一个必需的订单,但它对我有效。我已经为这两个问题添加了详细信息:D谢谢ndm和GregPlease添加您收到的错误,并展示您如何尝试使用授权插件。您在哪里进行
allowUnauthenticated
呼叫?我在加载身份验证插件之后和加载授权之前立即获得了它。我不确定这是否是一个必需的订单,但它对我有效。我已经为这两个问题添加了详细信息:D谢谢ndm和Greg
Policy for `App\Model\Table\CarsTable` has not been defined.
Authorization\Policy\Exception\MissingPolicyException
Policy for `Cake\ORM\Table` has not been defined.
Authorization\Policy\Exception\MissingPolicyException