如何使 Laravel 中的特定会话失效(用户使用“记住我”功能)

问题描述 投票:0回答:2

使用 Laravel 5.1 和“文件”会话驱动程序

我正在尝试为用户提供工具来跟踪他们的会话,并通过在数据库中保存他们的

session_id
记录来随时使它们失效。对于数据库,我的意思是,我维护一个名为
user_sessions
的表,它将
user_id
与其
session_id
相关联(由
Session::getId()
获得)。

因此,为了使会话无效,我尝试了以下代码,

$sessionId = Session::getId();
Session::setId($sessionId);
Session::invalidate();

对于以下情况,它工作得非常好: 用户不使用“记住我”功能。

对于用户使用记住我功能的情况,上面的代码不起作用,因此,我另外尝试将

remember_token
字段设置为
null
,如此答案中指定,但是这样,用户的所有会话都将被销毁,包括当前会话。

php laravel laravel-5 laravel-5.1
2个回答
0
投票

您可以简单地使用

use Illuminate\Support\Facades\Session;

Session::forget('YOUR_SESSION_ID');

如果想获取当前会话Id:

Session::driver()->getId();

希望对你有帮助


0
投票

会议是短暂的。如果您想要更持久的东西,您可以使用某种长期用户设置表。

创建表格

user_settings
:

id (PK), user_id(FK users table), settings(BLOB?), created_at, updated_at

添加型号:

class UserSetting extends Model {
      public function user() {
            return $this->belongsTo(User::class);
      }
}

您还可以通过以下方式将用户与这些关联:

 class User extends Model {
 //...
     public function settings() {
         $this->hasMany(UserSetting::class);
     }
 }

然后您可以通过以下方式获取所有用户会话:

 User::find($u)->settings();

当用户通过记住令牌定期或自动登录时,会触发

Login
事件。

您可以在您的活动服务提供商处收听:

\Event::listen(\Illuminate\Auth\Events\Login::class, function ($event) {
       // Here you can load the last settings in the session if you want e.g. 
       session(['current_settings' => $event->user->settings()->latest()->value('id') ]); 
        // or you can just make a new entry: 
        $settings = new UserSettings();
        $event->user->settings()->save($settings);
        session(['current_settings' => $settings->id ]);
});

请注意,您必须手动保留需要保留的内容,而不是仅仅将它们放入会话中。

© www.soinside.com 2019 - 2024. All rights reserved.