You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何在路由间存储已登录用户值到共享变量

Laravel自定义登录中Session存储用户信息问题解决

问题分析

  1. 未在登录成功分支写入持久Session:你当前在密码验证通过后,使用return redirect('/home')->with('user',Auth::user());,但未启用官方认证库,Auth::user()必然返回null;且->with()存储的是闪存Session,仅能在下次请求中读取一次,无法跨路由持久使用。
  2. Session写入位置错误:你仅在密码过期分支执行了$request->session->put(['Cuser'=>$user]);,但这不属于正常登录成功流程,无法覆盖用户正常登录的场景。
  3. 密码明文校验存在安全风险:直接用$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

额外建议

  • 可创建全局中间件,检查Cuser Session是否存在,未登录则自动跳转登录页面,减少重复判断代码。
  • 退出登录时,执行$request->session()->forget('Cuser');清除用户Session,或用$request->session()->flush();清空所有Session。

内容的提问来源于stack exchange,提问作者Youssef Elhejjioui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:07:09