egg如何让用户下线

开发管理后台应用时常有这样的需求:管理员需要在后台控制用户的某些状态,比如让用户下线,但是登录态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
// 有效期(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)

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

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

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