Laravel双Guard认证下@auth('portal')不生效、@guest登录后仍显示问题
问题修复步骤
1. 修复auth.php配置错误
你当前的认证配置存在键名不匹配问题:
// guards配置里portal的provider写的是portals 'portal' => [ 'driver' => 'session', 'provider' => 'portals' // 这里的portals和下面providers的键名对不上 ], // 但providers数组里的键是portal 'providers' => [ 'portal' => [ // 键名是portal,不是portals 'driver' => 'eloquent', 'model' => App\Models\Portal::class, ], ]
直接把guards里portal的provider值改为portal即可。
2. 修正Portal登录逻辑,指定guard认证
检查PortalLoginController的login方法,必须显式指定用portal guard做认证,不能用默认的web guard:
// 正确的登录逻辑示例 public function login(Request $request) { $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); // 必须指定guard('portal'),不能直接用Auth::attempt if (Auth::guard('portal')->attempt($credentials, $request->boolean('remember'))) { $request->session()->regenerate(); return redirect()->intended('/'); } return back()->withErrors([ 'email' => '账号或密码错误', ])->onlyInput('email'); }
3. 修复Blade游客判断逻辑
Laravel的@guest指令不指定guard时,默认只检查系统默认的web guard,只要web guard未登录,哪怕portal guard已登录也会判定为游客。把原有@guest替换为双guard未登录判断:
{{-- 替换原来的 @guest --}} @if (!Auth::guard('web')->check() && !Auth::guard('portal')->check()) {{-- 原有的游客导航内容 --}} @endif
4. 补充移动端portal登录状态判断
当前移动端导航仅判断了web guard的登录状态,需要补充portal的判断:
<!-- 移动端菜单里@auth('web')结束后添加 --> @auth('portal') <li> <form action="{{ route('portal_logout') }}" method="post" class="block text-sm px-2 py-4 hover:bg-green-500 transition duration-300"> @csrf <button type="submit">Portal Logout</button> </form> </li> @endauth
5. 可选调试步骤
如果修改后仍未生效,可以在视图中临时添加调试代码确认认证状态:
{{ dd(Auth::guard('portal')->check(), Auth::guard('portal')->user()) }}
如果输出为false,再检查两点:
- Portal模型是否继承了
Illuminate\Foundation\Auth\User类(也就是Authenticatable类) - 存储的portal用户密码是否用
Hash::make()加密,attempt方法会自动校验哈希加密后的密码
内容的提问来源于stack exchange,提问作者Frevelman
相关产品推荐
相关产品推荐

