【问题标题】:Laravel 5.5 - remember me and custom session values issueLaravel 5.5 - 记住我和自定义会话值问题
【发布时间】:2020-02-11 19:54:23
【问题描述】:

我安装了 laravel 5.5,并在登录时在会话中设置了一些自定义值

在 Auth/LoginController 中

public function authenticated(Request $request, $user)
{    
    Session::put('full_name', 'Thomas');
    Session::put('age', '35');
    Session::put('place', 'UK');
    Session::save();
}

我在 .env 文件中将会话超时设置为 1 分钟

SESSION_LIFETIME=1

当用户登录时,如果他点击记住我复选框,则会生成一个新的 cookie,并将 remember_token 插入到 USERS 表中。

从会话中获取自定义会话值后,我在视图文件中打印它们

$full_name = Session::get('full_name');
$age = Session::get('age');
$place= Session::get('place');
return view('home', compact('full_name', 'age', 'place'));

在 1 分钟不活动后,我的会话过期,但由于用户选中了记住我,他将被记录但 Session 中的值消失了

这没有意义!,只要用户登录,我就需要会话值。

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    如果用户通过remember_token 功能获得身份验证,则不会调用Auth\LoginController@authenticated 方法。

    对此的最佳做法是使用全局中间件来检查用户是否经过身份验证以及会话数据是否已设置。如果未设置,则设置数据。

    您的中间件功能可能与以下类似:

    public function handle($request, Closure $next, $guard = null)
    {
        if(!Auth::check()) {
            return $next($request);
        }
    
        if(Session::has('full_name') && Session::has('age') && Session::has('place')) {
            Session::put('full_name', 'Thomas');
            Session::put('age', '35');
            Session::put('place', 'UK');
            Session::save();
        }
    
        return $next($request);
    }
    

    【讨论】:

    • 我们可以使用 loginEvent(登录时触发)而不是中间件来实现同样的效果吗?
    • 没试过,但据我所知是不可能的
    • 谢谢,是否可以通过 remember_token 函数覆盖登录? (就像我们覆盖登录功能)
    • 我不够深入,无法 100% 确定,但我会说这将非常复杂,因为您必须覆盖很多 Illuminate\Auth 命名空间。 remember_me 功能通过RedirectIfAuthenticated 中间件工作,该中间件使用Auth 类来检查用户是否经过身份验证。 Auth 使用您的配置找到实现 Illuminate\Foundation\Auth\User as Authenticatable 的用户模型,其中 remember_me 函数获取他们的数据以通过 Auth::guard($guard)->check() 验证用户
    猜你喜欢
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2017-02-25
    • 2017-03-15
    • 2016-03-04
    相关资源
    最近更新 更多