开发管理后台应用时常有这样的需求:管理员需要在后台控制用户的某些状态,比如让用户下线,但是登录态session往往存储在redis,而session在有效的情况下不会进行更新,所以只能自己修改redis里sessionid的键值,以egg框架为例,操作思路如下:
登录接口记录用户的sessionid,这是关键:
1 2 3 4 5 6 7 8 9 10 11 12
| this.ctx.session.user = { user_id: user.user_id, }
const saddKey = this.config.name + user.user_id
const maxAge = this.config.session.maxAge
await this.app.redis.sadd(saddKey, this.ctx.session._sessCtx.externalKey)
await this.app.redis.expire(saddKey, maxAge / 1000)
|
后台让前台用户下线,退出登录状态:
1 2 3 4
| const sessKey = await this.app.redis.smembers(this.config.name + user_id)
await this.app.redis.del(...sessKey)
|
对于externalKey
的解释见:https://github.com/eggjs/egg/issues/2010