Laravel中如何在路由间存储已登录用户值到共享变量
Laravel自定义登录中Session存储用户信息问题解决
问题分析
- 未在登录成功分支写入持久Session:你当前在密码验证通过后,使用
return redirect('/home')->with('user',Auth::user());,但未启用官方认证库,Auth::user()必然返回null;且->with()存储的是闪存Session,仅能在下次请求中读取一次,无法跨路由持久使用。 - Session写入位置错误:你仅在密码过期分支执行了
$request->session->put(['Cuser'=>$user]);,但这不属于正常登录成功流程,无法覆盖用户正常登录的场景。 - 密码明文校验存在安全风险:直接用
$user->Password == $password做明文比对,生产环境必须改用哈希校验逻辑。
修改后的认证代码
use Illuminate\Support\Facades\Hash; public function authenticate(Request $request) { $email = Str::lower($request->input('Email')); $password = $request->input('password'); $Ftime = $request->input('Ftime'); $currentDateTime = Carbon::now(); $user = User::where('Email', $email)->first(); if ($currentDateTime->isAfter($Ftime)) { $newPassword = Str::random(60); // 哈希存储新密码,避免明文风险 $user->update(['Password' => Hash::make($newPassword)]); return redirect('login')->with('message', '密码已过期,请使用新密码登录')->with('new_password', $newPassword); } if ($user) { // 替换明文比对为哈希校验(前提是用户密码已哈希存储) if (Hash::check($password, $user->Password)) { // 登录成功,写入持久化Session $request->session()->put('Cuser', $user); return redirect('/home'); } else { return view('errors/pass', ['pass' => $password]); } } else { return view('errors/email', ['error' => $email]); } }
跨路由/视图获取Cuser
控制器/路由中获取
// 控制器方法内 $currentUser = session('Cuser'); // 或通过request实例获取 $currentUser = $request->session()->get('Cuser'); // 路由闭包中使用 Route::get('/profile', function () { $currentUser = session('Cuser'); // 业务逻辑处理 });
视图中获取
{{-- 使用session辅助函数直接读取 --}} @if(session('Cuser')) <div>当前登录用户:{{ session('Cuser')->name }}</div> @endif {{-- 先判断Session是否存在再读取 --}} @if($request->session()->has('Cuser')) <div>用户邮箱:{{ $request->session()->get('Cuser')->Email }}</div> @endif
额外建议
- 可创建全局中间件,检查
CuserSession是否存在,未登录则自动跳转登录页面,减少重复判断代码。 - 退出登录时,执行
$request->session()->forget('Cuser');清除用户Session,或用$request->session()->flush();清空所有Session。
内容的提问来源于stack exchange,提问作者Youssef Elhejjioui
相关产品推荐
相关产品推荐

