重写Login Controller的authenticated方法无效问题求助
问题分析与解决方案
嘿,我一眼就看出问题出在哪了——你自己重写了login方法,但完全跳过了框架自带的钩子触发逻辑!
Laravel的AuthenticatesUsers trait里的默认login方法,在用户认证成功后会自动调用authenticated这个钩子函数,但你自定义的login方法里直接用Auth::attempt判断后就返回视图了,根本没去触发authenticated,所以你写的dd("HI")当然不会执行啦。
给你两个解决思路,推荐第二个,更符合Laravel的设计:
方案一:修改自定义login方法,手动触发钩子
如果你非要保留自己的login方法,那就在认证成功后手动调用authenticated,还要处理好跳转逻辑:
public function login(Request $request) { if (Auth::attempt(['email' => $request->email, 'password' => $request->password, 'isActive' => '1'])) { // 手动调用authenticated钩子 $response = $this->authenticated($request, Auth::user()); // 如果authenticated有返回值就用它,否则用默认跳转 return $response ?: redirect()->intended($this->redirectPath()); } else { return $this->sendFailedLoginResponse($request, 'auth.failed_status'); } }
方案二:复用框架逻辑,只重写必要部分(推荐)
其实完全不用重写整个login方法,Laravel早就给我们留了扩展点。你要的isActive验证,可以通过重写credentials方法来实现,这样既能保留框架的钩子机制,代码也更简洁:
修正后的完整LoginController代码
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Mail\WelcomeMail; use Illuminate\Support\Facades\Mail; class LoginController extends Controller { use AuthenticatesUsers; /** * Where to redirect users after login. * * @var string */ protected $redirectTo = '/home'; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest')->except('logout'); } /** * 给登录验证添加isActive条件 */ protected function credentials(Request $request) { return array_merge( $request->only($this->username(), 'password'), ['isActive' => '1'] ); } protected function authenticated(Request $request, $user) { if (!$user->verified) { auth()->logout(); return back()->with('warning', 'You need to confirm your account. We have sent you an activation code, please check your email.'); } return redirect()->intended($this->redirectPath()); } }
这样修改后,框架会自动在认证成功后调用你的authenticated方法,你写的未验证用户登出提示逻辑就能正常工作了,而且代码更符合Laravel的最佳实践~
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

