php – 访客用户的授权和策略

案例:我正在使用Laravel的授权作为使用策略的主干来构建一个论坛.我运行的检查示例包括@can(‘view’,$forum)和@can(‘reply’,$topic),Gate :: allow(‘create_topic’,$forum)等.这些检查基本上检查是否users角色具有特定论坛,主题或帖子的权限.这样我就可以为我的应用程序中的每个论坛赋予角色非常具体的权限.

问题是所有这些检查都通过Gate类,特别是一个名为raw()的方法,它在第一行中执行此操作:

if (! $user = $this->resolveUser()) {
    return false;
}

这在处理论坛时会出现问题.我的应用程序的访客也应该被允许查看我的论坛,但是从上面的代码可以看出,如果用户没有登录,Laravels Gate类会自动返回false.

即使没有用户,我也需要能够触发我的策略.在我的ForumPolicy @ view方法中说,如果(User :: guest()&& $forum-> hasGuestViewAccess()){return true}

但正如您所看到的,此方法永远不会触发.

我还有办法让访客用户使用Laravel的授权功能吗?

我不知道有一种超自然的方法来实现这一点,但是如果有必要,你可以更改门的用户解析器,它负责查找用户(认情况下它从Auth :: user()读取).

由于解析器受到保护并且没有setter,因此您需要在创建时对其进行修改.门is instantiated in Laravel’s AuthServiceProvider.您可以扩展此类并使用您的子类替换app.providers配置中的引用.

这将取决于你返回什么样的客户对象(只要它是真实的),但我可能会使用像空的用户模型:

protected function registeraccessGate()
{
    $this->app->singleton(GateContract::class,function ($app) {
        return new Gate($app,function () use ($app) {
            $user = $app['auth']->user();
            if ($user) {
                return $user;
            }
            return new \App\User;
        });
    });
}

您可以更进一步,在其上设置一个特殊属性,如$user-> isGuest,甚至可以定义一个特殊的guest类或常量.

或者,您可以在Auth级别调整您的进程,以便所有已注销的会话都包含在对Auth :: setUser($guestUserObject)的调用中.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...