案例:我正在使用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}
但正如您所看到的,此方法永远不会触发.
我不知道有一种超自然的方法来实现这一点,但是如果有必要,你可以更改门的用户解析器,它负责查找用户(默认情况下它从Auth :: user()读取).
原文链接:https://www.f2er.com/php/137478.html由于解析器受到保护并且没有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)的调用中.