Laravel非默认Guard验证凭证报错:TokenGuard无attempt方法
问题
项目中配置了两个Guard:
- 第一个是"web",关联admins表,使用session驱动
- 第二个是"mobile",关联users表,使用token驱动
配置信息如下:
'defaults' => [ 'guard' => 'web', 'passwords' => 'admins', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'admins', ], 'mobile' => [ 'driver' => 'token', 'provider' => 'users', ], ],
注:使用的是Sanctum认证系统。
尝试使用第二个Guard进行登录验证时,执行凭证校验出现错误,登录代码如下:
public function login(Request $request) { ............. if(!Auth::guard('mobile')->attempt($request->only(['email', 'password']))){ return response()->json([ 'status' => false, 'message' => 'Email & Password does not match with our record.', ], 401); } ............. }
报错信息:
"Call to undefined method Illuminate\Auth\TokenGuard::attempt()"
请问如何验证非默认Guard的凭证,或者有什么解决方案?
解决方案
问题核心在于TokenGuard本身没有attempt()方法,这个方法是SessionGuard的专属方法。针对基于Token的Sanctum认证,需要换一种逻辑完成凭证验证:
- 手动校验用户凭证
直接通过用户模型匹配账号,再验证密码正确性:
$user = \App\Models\User::where('email', $request->email)->first(); if (!$user || !Hash::check($request->password, $user->password)) { return response()->json([ 'status' => false, 'message' => 'Email & Password does not match with our record.', ], 401); }
- 生成Sanctum认证Token
凭证校验通过后,为用户生成API访问Token(移动端通常使用Personal Access Token):
// 可自定义Token名称,比如绑定用户设备标识 $token = $user->createToken('mobile-auth-token')->plainTextToken; return response()->json([ 'status' => true, 'token' => $token, 'user' => $user ]);
- 优化Guard配置(可选)
如果希望mobileGuard适配Sanctum的认证逻辑,可以将Guard的驱动改为sanctum:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'admins', ], 'mobile' => [ 'driver' => 'sanctum', 'provider' => 'users', ], ],
调整后,后续请求可通过Auth::guard('mobile')->user()获取认证用户,但依然不能使用attempt()方法,凭证校验仍需按步骤1的方式手动完成。
内容的提问来源于stack exchange,提问作者khaled amoudi
相关产品推荐
相关产品推荐

