为啥laravel中的两个守卫会相互影响?

Posted

技术标签:

【中文标题】为啥laravel中的两个守卫会相互影响?【英文标题】:Why do two guards in laravel affect each other?为什么laravel中的两个守卫会相互影响? 【发布时间】:2021-06-24 06:45:24 【问题描述】:

对于我的电子商务应用程序,我使用user 的默认保护并为控制面板admin 设置了另一个保护,但登录或注销user 也会影响管理控制面板中的状态,并且反之亦然。这是为什么呢?

这是我的授权文件:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
    'user' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],


'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Models\Admin::class,
    ],

这是我的管理员登录和注销控制器:

public function enter(AdminLogin $admin)
        $credentials = $admin->only(['email', 'password']);
        if(Auth::guard('admin')->attempt($credentials)):
            $admin = ModelsAdmin::whereEmail($admin->email)->first();
            Auth::login($admin);
            return redirect()->route('dashboard.show');
        endif;

        return redirect()->back()->withMsg("There is A worng in your Credentials");
    

    public function logout()
        auth('admin')->logout();

        return redirect()->route('admin.login');
    

这是我的用户登录和注销:

public function enter(UserCheck $user)
    $credentials = $user->only(['email', 'password']);
    if(Auth::guard('user')->attempt($credentials)):
        $login = ModelsUser::whereEmail($user->email)->first();
        Auth::login($login);
        return redirect()->route('user.dashboard');
    endif;
    return back()->withMsg('Sorry sir you Entered invalid Credentials');

public function logout(Request $request)

    Auth::guard('user')->logout();
    $request->session()->invalidate();
    $request->session()->regenerateToken();
    return redirect()->route('user.login');

【问题讨论】:

我认为Auth::login($admin);Auth::login($login); 是不必要的。因为如果凭据有效,Auth::guard('admin')->attempt($credentials)Auth::guard('user')->attempt($credentials) 将创建会话。如果检查,您可以在内部重定向用户。 它在某些情况下有效,例如在管理面板中登录或注销不影响用户面板但显示管理面板应登录用户面板,即使管理员凭据为真 如何检查用户或管理员是否已登录? @auth('admin') 欢迎 auth('admin')->user()->name @endauth @auth('user') @endauth 【参考方案1】:

问题出在管理中间件中。我通过 auth()->check() 对管理员进行了检查,它应该是 auth('admin')->check() 因为用户有另一个中间件是默认的,所以这两个有冲突

【讨论】:

以上是关于为啥laravel中的两个守卫会相互影响?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 项目中同时使用 web 的守卫和 api 的守卫?

[MRCTF2021]ez_laravel复现

Laravel 5.5 中忽略了非默认守卫

BZOJ4557 [JLoi2016]侦察守卫 树形dp

为啥 C++17 中的全局内联变量和静态内联成员需要守卫?

LARAVEL:一个身份验证守卫的多个驱动程序