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

时间:2018-05-03 05:34:10

标签: php laravel laravel-5 laravel-5.1

使用 Laravel 5.1& '文件'会话驱动程序

我正在尝试为用户提供跟踪他们的会话的工具,并通过在数据库中保留他们session_id的记录来随时使他们无效。对于数据库,我的意思是,我维护了一个名为user_sessions的表,它将user_idsession_id(由Session::getId()获得)相关联。

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

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

并且它非常适用于用户不使用“记住我”功能的情况。

对于用户使用记住我功能的情况,上面的代码无效,所以,我还尝试将remember_token字段设置为{{ 1}}在this answer中指定,但是这样,用户的所有会话都会被销毁,包括当前的会话。

2 个答案:

答案 0 :(得分:1)

您只需使用

即可
use Illuminate\Support\Facades\Session;

Session::forget('YOUR_SESSION_ID');

如果您想获得当前会话ID:

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

我希望它有所帮助

答案 1 :(得分: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 ]);
});

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