Laravel 5.5:阻止非管理员用户访问后台控制面板
解决Laravel 5.5重置密码后非管理员绕过验证登录后台的问题
这个问题我之前也碰到过,根源很明确:重置密码的登录流程并没有经过你在LoginController中重写的credentials方法。Laravel的重置密码逻辑是在ResetPasswordController里完成的,它调用Auth::login($user)直接完成登录,完全跳过了LoginController里的验证规则,所以非管理员用户重置密码后就能直接登录后台了。
下面给你几个实用的解决方案,按需选择:
方案一:全局登录后验证(推荐,覆盖所有登录场景)
在LoginController中重写authenticated方法,不管用户是通过正常登录、重置密码还是其他方式登录,只要登录成功就检查用户类型,不符合就强制退出:
use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; protected function authenticated(Request $request, $user) { // 验证用户类型是否为admin if ($user->type !== 'admin') { Auth::logout(); return redirect()->route('login')->withErrors(['email' => '只有管理员才能访问后台']); } return redirect()->intended($this->redirectPath()); }
这种方法最稳妥,不管用户从哪个入口登录,都会触发这个验证,彻底杜绝非管理员进入后台的可能。
方案二:修改重置密码流程的登录逻辑
如果你只想针对重置密码场景做限制,可以在ResetPasswordController中重写reset方法,在登录前检查用户类型:
use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Auth\Events\PasswordReset; use Illuminate\Contracts\Auth\PasswordBroker; public function reset(Request $request) { $request->validate($this->rules(), $this->validationErrorMessages()); // 尝试重置密码 $response = $this->broker()->reset( $this->credentials($request), function ($user, $password) { $this->resetPassword($user, $password); } ); // 登录后检查用户类型,非admin则退出 if (Auth::check() && Auth::user()->type !== 'admin') { Auth::logout(); return redirect()->route('login')->withErrors(['email' => '只有管理员才能登录后台']); } return $response == PasswordBroker::PASSWORD_RESET ? $this->sendResetResponse($request, $response) : $this->sendResetFailedResponse($request, $response); }
方案三:重置密码时直接验证用户类型
还可以在重置密码的核心逻辑里加入验证,让非管理员用户连重置密码的流程都无法完成(如果业务允许的话):
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; use Illuminate\Auth\Events\PasswordReset; protected function resetPassword($user, $password) { // 重置前先检查用户类型 if ($user->type !== 'admin') { throw new \Exception('只有管理员才能重置后台密码'); } $user->password = Hash::make($password); $user->setRememberToken(Str::random(60)); $user->save(); event(new PasswordReset($user)); Auth::login($user); }
内容的提问来源于stack exchange,提问作者user779681
相关产品推荐
相关产品推荐

