访客用户的授权和策略
Posted
技术标签:
【中文标题】访客用户的授权和策略【英文标题】:Authorization and Policies for Guest users 【发布时间】:2016-05-20 23:09:04 【问题描述】:案例:我正在使用 Laravel 的授权作为使用策略的主干建立一个论坛。我运行的检查示例有@can('view', $forum)
、@can('reply', $topic)
、Gate::allows('create_topic', $forum)
等。这些检查主要检查用户角色是否具有特定论坛、主题或帖子的权限。这样我就可以为我的应用程序中的每个论坛赋予角色非常具体的权限。
问题是所有这些检查都通过 Gate 类,特别是一个名为 raw()
的方法,它在第一行执行以下操作:
if (! $user = $this->resolveUser())
return false;
这在处理论坛时会出现问题。我的应用程序的访客也应该被允许查看我的论坛,但是从上面的代码可以看出,如果用户没有登录,Laravels Gate 类会自动返回 false。
即使没有用户,我也需要能够触发我的策略。用我的ForumPolicy@view
方法说,我做if(User::guest() && $forum->hasGuestViewAccess()) return true
但是如你所见,这个方法永远不会触发。
有没有办法让我仍然对来宾用户使用 Laravel 的授权功能?
【问题讨论】:
【参考方案1】:我刚刚发布了一个package,它允许将权限逻辑应用于来宾用户。它稍微修改了 Laravel 的 Authorization 以在没有用户被解析时返回 Guest
对象而不是 null
。此外,现在每个授权检查都会到达 Gate,而不是因为没有经过身份验证的用户而立即失败授权。
【讨论】:
【参考方案2】:我不知道实现这一点的超自然方式,但如果有必要,您可以更改门的 用户解析器,它负责查找用户(默认情况下它从 @ 读取987654322@).
由于解析器受到保护并且没有设置器,因此您需要在创建时对其进行修改。大门is instantiated in Laravel's AuthServiceProvider
。您可以扩展该类并将app.providers
配置中对它的引用替换为您的子类。
这将取决于你返回什么样的访客对象(只要它是真实的),但我可能会使用类似空的 User
模型:
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
,甚至定义一个特殊的访客类或常量。
或者,您可以在Auth
级别调整您的流程,以便所有注销的会话都包含在对Auth::setUser($guestUserObject)
的调用中。
【讨论】:
您也可以通过使用Gate::forUser($guestUser)
来解决解析器问题,但这在您的情况下似乎没有用,因为您仍然需要为客人和用户提供不同的代码。以上是关于访客用户的授权和策略的主要内容,如果未能解决你的问题,请参考以下文章
用户授权 - 为用户分配授权策略 .Net Core 3.1