Laravel如何判断当前认证守卫,解决多守卫登录冲突问题
解决Laravel多守卫场景下判断当前登录守卫的问题
我之前在做多认证守卫的项目时也碰到过一模一样的问题,直接用Auth::guard('name')->check()确实会在多守卫同时登录时覆盖变量,而且Auth::guard()返回的是守卫实例,不是字符串,所以直接和'admin'比较肯定无效。这里给你两个靠谱的解决方案:
方案一:利用用户模型的guardName属性
Laravel默认的用户模型(继承Illuminate\Foundation\Auth\User)会自动记录当前用户是通过哪个守卫登录的,这个属性就是guardName。你可以直接用它来判断:
@guest @else <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false" aria-haspopup="true"> {{ Auth::user()->name }} <span class="caret"></span> </a> @php // 获取当前用户对应的守卫名称 $currentGuard = Auth::user()->guardName; // 根据守卫名称设置路由 $profile = $currentGuard === 'admin' ? '/admin/myprofile' : '/myprofile'; $logout = $currentGuard === 'admin' ? '/admin/logout' : '/logout'; @endphp <ul class="dropdown-menu"> <li><a href="{{ $profile }}">My Profile</a></li> <li> <a href="{{ $logout }}">Log Out</a> </li> </ul> </li> @endguest
这个方法的优势是精准绑定当前用户的登录守卫,不管有没有多个守卫同时登录,都能准确拿到对应用户的守卫配置。
方案二:根据当前路由上下文判断
如果你的后台路由都带有admin前缀(比如/admin/*),那可以直接通过当前请求的路由来判断,这样更贴合用户当前的操作场景(比如用户在后台页面就显示后台的退出和个人中心链接):
@guest @else <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false" aria-haspopup="true"> {{ Auth::user()->name }} <span class="caret"></span> </a> @php // 判断当前是否在admin路由下 $isAdminRoute = Request::is('admin/*'); $profile = $isAdminRoute ? '/admin/myprofile' : '/myprofile'; $logout = $isAdminRoute ? '/admin/logout' : '/logout'; @endphp <ul class="dropdown-menu"> <li><a href="{{ $profile }}">My Profile</a></li> <li> <a href="{{ $logout }}">Log Out</a> </li> </ul> </li> @endguest
这个方法适合同一个用户可能在不同路由组下使用不同守卫的场景,体验更符合用户预期。
另外补充一下:你之前尝试的Auth::guard()=='admin'无效,是因为Auth::guard()返回的是Illuminate\Contracts\Auth\Guard接口的实例,不是字符串类型,所以直接和字符串比较肯定不成立,上面的两种方法都能完美避开这个问题。
内容的提问来源于stack exchange,提问作者user9229406
相关产品推荐
相关产品推荐

