Php 来宾用户的授权和策略

Php 来宾用户的授权和策略,php,laravel,laravel-5,laravel-5.1,Php,Laravel,Laravel 5,Laravel 5.1,案例:我正在建立一个论坛,使用Laravel的授权作为使用策略的主干。我运行的检查示例有@can('view',$forum),和@can('reply',$topic),Gate::allows('create_topic',$forum)等。这些检查基本上检查用户角色是否具有特定论坛、主题或帖子的权限。这样,我可以为我的应用程序中的每个论坛赋予角色非常特定的权限 问题是所有这些检查都要通过Gate类,特别是一个名为raw()的方法,它在第一行中执行以下操作: if (! $user = $t

案例:我正在建立一个论坛,使用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
method,我做
if(User::guest()&&$forum->hasGuestViewAccess()){return true}

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


有什么方法可以让我在来宾用户中仍然使用Laravel的授权功能吗?

我不知道有什么超自然的方法可以实现这一点,但如果有必要,您可以更改gate的用户解析程序,该程序负责查找用户(默认情况下,它从
Auth::user()
读取)

由于冲突解决程序受保护且没有设置程序,因此需要在创建时对其进行修改。大门。您可以扩展这个类,并用您的子类替换
app.providers
config中对它的引用

返回哪种来宾对象取决于您(只要它是真实的),但我可能会使用空的
用户
模型:

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)
的调用中。我刚刚发布了一个允许将权限逻辑应用于来宾用户的。它稍微修改了Laravel的授权,以便在没有解析用户时返回
Guest
对象,而不是
null
。此外,每次授权检查现在都会进入网关,而不是因为没有经过身份验证的用户而立即导致授权失败。

您也可以通过使用
Gate::forUser($guestUser)
绕过解析器问题,但这在您的情况下似乎并不有用,因为您仍然需要为来宾和用户提供不同的代码。