node 控制用户的session

有这样的场景:管理员需要在后台控制用户的某些状态,比如让用户下线,更新某个用户的权限等,但是登录态session往往存储在redis,而session在有效的情况下不会进行更新,所以只能自己修改redis里sessionid的键值,以egg框架为例,操作思路如下:

登录接口记录用户的sessionid,这是关键:

// 登录逻辑...
this.ctx.session.user = {
  user_id: user.user_id,
}
// 可以自定义命名
const saddKey = this.config.name + user.user_id
// 有效期(ms)
const maxAge = this.config.session.maxAge
// 缓存用户的sessionid,externalKey 是 随机生成的key,即redis中的sessionid
await this.app.redis.sadd(saddKey, this.ctx.session._sessCtx.externalKey)
// 设置过期时间,ttl 单位为秒
await this.app.redis.expire(saddKey, maxAge / 1000)

后台让前台用户下线,退出登录状态:

// 获取这个用户的sessionid
const sessKey = await this.app.redis.smembers(this.config.name + user_id)
// 删除用户的session
await this.app.redis.del(...sessKey)

同样的思路,可以在session中存储用户的权限数据,在后台编辑用户权限,实时更新redis中sessionid的值。


对于externalKey的解释见:https://github.com/eggjs/egg/issues/2010

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容