【问题标题】:Laravel 5.4: Can't get Auth::guard to work as expectedLaravel 5.4:无法让 Auth::guard 按预期工作
【发布时间】:2017-04-28 03:46:17
【问题描述】:

我正在使用Auth::guard 来检查注销控制器中正在使用哪个守卫。如果是管理员守卫,那么我希望重定向到管理员登录,否则转到用户登录。

我的期望是Auth::guard('admin') 检查看守是否确实是管理员类型。如果是,则使用 if 语句进行。

但是,它并没有按我预期的方式工作。我用dd(Auth::guard()) 检查我的后卫,它肯定是web 后卫。但无论如何,Auth::guard('admin') 仍然让它通过。

我做错了什么?我的假设是Auth::guard 错了吗?非常感谢!

if (Auth::guard('admin') ) {

        $this->guard()->logout();

        $request->session()->flush();

        $request->session()->regenerate();  

        return redirect('admin-login');
    }
    else {

        $this->guard()->logout();

        $request->session()->flush();

        $request->session()->regenerate();  
        return redirect('/login');
    }

【问题讨论】:

    标签: php laravel-5.4


    【解决方案1】:

    当您使用Auth::guard('admin') 时,它会抓取那个守卫如果它存在,它不会检查该守卫当前是否正在使用。由于该守卫确实存在,if (Auth::guard('admin') ) 将始终为真。

    要检查该防护当前是否正在使用,您可以执行if(Auth::getDefaultDriver() === 'admin')。当您使用 auth:admin 中间件时,它会将 admin 设置为默认保护,以便您可以检查。

    一个更干的方法是:

        $this->guard()->logout();
    
        $request->session()->flush();
    
        $request->session()->regenerate();  
    
        return redirect(Auth::getDefaultDriver() === 'admin' ? '/admin-login' : '/login')
    

    【讨论】:

    • 感谢您的快速回复。 Auth::getDefaultGuard 似乎不存在:AuthManager.php 第 294 行中的 FatalThrowableError:调用未定义的方法 Illuminate\Auth\SessionGuard::getDefaultGuard()
    • @Vince 你是对的,我的错。应该是getDefaultDriver()。我已经更新了我的答案。
    • 昨天下午我们全国网络中断了,就在我正要回复你的时候 :( 看 Laravel api,getDefaultDriver 没有得到守卫的名字,它得到了驱动,即会话或令牌.查看 AuthenticatesUsers.php 第 170 行,有一个函数 Auth::guard() 确实获得了警卫。如果我调用该函数并执行 dd($this->guard()); 我得到一个对象(数组?) 其中包含保护名称。在 pastebin 中检查:[link] pastebin.com/piDD7A4f [/link] 问题如何从对象/数组中提取名称?非常感谢!
    • 你试过getDefaultDriver()吗?当我运行它时,我得到的是保护名称 ex 'web' 或 'api' 的字符串,而不是你说的驱动程序。它返回存储在config/auth.php['defaults']['guard'] 中的值。当您使用shouldUse('admin') 方法使用auth:admin 中间件时,该值会更新。查看getDefaultDriver() 的框架源代码。它抓住了当前的警卫,而不是司机。
    • 是的 - 你是对的。看起来我有一个完全不同的问题:我的管理员登录正在使用管理员保护,但不知何故我不明白,当涉及到注销时,它显示为“网络”。混合管理员中的某个地方正在切换到网络。那可能吗 ?你会去 laracasts 论坛吗?我问,因为在那里展示东西比在 SO 上更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2017-08-02
    • 2021-12-22
    • 1970-01-01
    • 2019-10-01
    • 2019-10-13
    相关资源
    最近更新 更多