Laravel中Auth::attempt后带auth中间件的路由无法访问问题
Laravel登录后无法通过auth中间件授权的问题解决
问题核心原因
你自定义的login方法存在两个关键问题:一是缺少必要的类引入,导致会话和认证逻辑无法正常执行;二是没有完整实现登录后的会话持久化流程,即便Auth::attempt验证通过,用户会话也没被正确保存,所以auth中间件识别不到已登录状态。另外还可能存在守卫配置不匹配的情况。
具体修复步骤
1. 补充缺失的类引入
在LoginController顶部添加以下引入代码,确保用到的类能被正确识别:
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Session; use Illuminate\Http\Request; use App\Http\Requests\AdminLoginRequest; // 确认这个请求类的路径正确
2. 优化登录逻辑(二选一即可)
方式一:复用trait的登录逻辑(推荐)
不需要完全重写login方法,只需要在登录成功后添加角色判断,重写AuthenticatesUsers trait里的authenticated方法即可:
// 删掉你自定义的login方法,添加这个方法 protected function authenticated(Request $request, $user) { if ($user->role == 'user') { Auth::logout(); return redirect()->route('login')->withErrors(['phone' => '无后台访问权限']); } return redirect()->route('dashboard.index'); }
这种方式会保留trait自带的完整会话处理、记住我等逻辑,避免会话丢失问题。
方式二:完善自定义的login方法
如果一定要自己实现登录逻辑,必须处理验证失败的情况,并且确保会话正确持久化:
public function login(AdminLoginRequest $request) { $credentials = $request->only('phone', 'password'); // 尝试登录,支持"记住我"功能 if (Auth::attempt($credentials, $request->has('remember'))) { $user = Auth::user(); if ($user->role == 'user') { Auth::logout(); return redirect('login')->withErrors(['phone' => '无后台访问权限']); } // 重新生成会话,防止会话固定攻击 $request->session()->regenerate(); return redirect()->route('dashboard.index'); } // 登录失败,返回登录页并提示错误 return back()->withErrors([ 'phone' => '手机号或密码错误', ])->withInput($request->only('phone')); }
3. 检查守卫配置(如果后台用独立用户模型)
如果后台用户和前台用户是不同的模型(比如Admin模型),需要配置对应的守卫:
第一步:修改config/auth.php添加守卫
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, // 你的后台用户模型 ], ],
第二步:路由里指定守卫
Route::namespace('App\Http\Controllers\Admin') ->prefix('dashboard') ->middleware('auth:admin') // 指定使用admin守卫 ->group(function () { Route::get('/index', function () { echo 'hi there'; })->name('dashboard.index'); });
同时在登录方法里指定守卫:
if (Auth::guard('admin')->attempt($credentials, $request->has('remember'))) { // 后续逻辑 }
4. 检查会话目录权限
确保storage/framework/sessions目录有读写权限,.env里的SESSION_DRIVER设置为file或database(默认是file)。
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

