首页 > 解决方案 > Laravel 双重身份验证和@guest 声明

问题描述

我使用 Laravel 5.6,我有 2 个身份验证守卫:

'user' => [
    'driver' => 'session',
    'provider' => 'users',
],

'member' => [
    'driver' => 'session',
    'provider' => 'members',
],

在我的模板中,我只是有一个小问题,例如我想使用@auth('user') 来加载正确的视图,但是当我使用@guest 时,'member' 被视为来宾,我解释说:

在我的刀片中:

@auth('user')
   // content for user logged
@endauth

@auth('member')
   // content for member logged
@endauth

@guest
   // content for guest only
   // but this content is shown for members logged (in addition of the @auth('member') content
@endguest

我不知道为什么,当会员登录时,他会看到@guest 内容和@auth('member') 内容。我需要配置其他东西吗?我想要用户身份验证的相同行为。

**编辑**

好的,用这种丑陋的方式,它可以工作:

@guest('member')
   @guest('user')
     // only guest
   @endguest
@endguest

标签: laravel

解决方案


这是Guards的问题。您正在为当前用户显式检查 2 Guards。您不是在请求默认的 Guard,而是明确要求特定的 Guard。

guest检查未指定要使用的 Guard,因此使用了默认 Guard。从这段代码中无法知道默认的 Guard 是什么,或者它是否是您实际检查的 2 个 Guard 之一。

将 Guard 问题放在一边,您的条件逻辑存在问题。它们不是 3 个独立的条件,它们相互依赖。它不是if this if this if this,它是if this, elseif this, else

@auth('user')
    ...
@elseauth('member')
    ...
@else
    ...
@endif

这是:

@if (auth()->guard('user')->check())
    ...
@elseif (auth()->guard('member')->check())
    ...
@else
    ...
@endif

在示例代码的上下文中,您定义了 aguest是什么。您正在根据您的代码将其定义为任何未经身份验证的用户usermember. 不是守卫告诉你的是客人。您的“客人”检查不是@guest您自己的逻辑。


推荐阅读