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

mrphzbgm  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(134)

使用Laravel 5.1 & 'file' Session Driver
我试图通过在数据库中保存session_id的记录,为用户提供跟踪他们的会话并随时使其无效的工具。对于数据库,我的意思是,我维护一个名为user_sessions的表,该表将user_id与它们的session_id(由Session::getId()获得)相关联。
因此,为了使Session无效,我尝试了以下代码:

  1. $sessionId = Session::getId();
  2. Session::setId($sessionId);
  3. Session::invalidate();

并且它工作得非常好,对于用户不使用Remember Me功能的情况。
对于用户使用Remember Me功能的情况,上述代码不起作用,因此,我另外尝试将remember_token字段设置为null,如this answer中所指定的,但使用此方法,用户的所有会话都会被破坏,包括当前会话。

pb3s4cty

pb3s4cty1#

你可以简单地使用

  1. use Illuminate\Support\Facades\Session;
  2. Session::forget('YOUR_SESSION_ID');

如果要获取当前会话ID:

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

我希望它能帮助

xzlaal3s

xzlaal3s2#

会议注定是短暂的。如果你想要一些更持久的东西,你可以使用某种长期用户设置表。
创建表格user_settings

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

添加模型:

  1. class UserSetting extends Model {
  2. public function user() {
  3. return $this->belongsTo(User::class);
  4. }
  5. }

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

  1. class User extends Model {
  2. //...
  3. public function settings() {
  4. $this->hasMany(UserSetting::class);
  5. }
  6. }

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

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

当用户定期登录或通过记住令牌自动登录时,将触发Login事件。
您可以在事件服务提供程序中侦听此内容:

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

请注意,您将不得不手动持久化需要持久化的内容,而不是仅仅将它们放在会话中。

展开查看全部

相关问题