使用 Laravel 5.1 和“文件”会话驱动程序,
我正在尝试为用户提供工具来跟踪他们的会话,并通过在数据库中保存他们的
session_id
记录来随时使它们失效。对于数据库,我的意思是,我维护一个名为 user_sessions
的表,它将 user_id
与其 session_id
相关联(由 Session::getId()
获得)。
因此,为了使会话无效,我尝试了以下代码,
$sessionId = Session::getId();
Session::setId($sessionId);
Session::invalidate();
对于以下情况,它工作得非常好: 用户不使用“记住我”功能。
对于用户使用记住我功能的情况,上面的代码不起作用,因此,我另外尝试将
remember_token
字段设置为null
,如此答案中指定,但是这样,用户的所有会话都将被销毁,包括当前会话。
您可以简单地使用
use Illuminate\Support\Facades\Session;
Session::forget('YOUR_SESSION_ID');
如果想获取当前会话Id:
Session::driver()->getId();
希望对你有帮助
会议是短暂的。如果您想要更持久的东西,您可以使用某种长期用户设置表。
创建表格
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 ]);
});
请注意,您必须手动保留需要保留的内容,而不是仅仅将它们放入会话中。