有这样的场景:管理员需要在后台控制用户的某些状态,比如让用户下线,更新某个用户的权限等,但是登录态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
网友评论