在项目中使用到了egg-session、egg-session-redis 将session内容保存在redis中。其实现原理是在app上挂载一个sessionStore 并通过时间戳+随机串获得一个externalKey与用户cookie映射,通过该externalKey进行redis读写(可能我说的原理不太对)。 但在某些场景中(比如管理员禁用某用户账号,在设置用户状态后将该用户的session禁用使其登出)如何手动将该session失效? 因为无法获取该用户的externalKey,个人感觉问题的关键是能够构建一张用户信息与externalKey的映射表。 个人有一个感觉实现起来不优雅的思路:将egg-session-redis重写,当用户登录时调用该插件设置session时候把externalKey一并set进去,并将该key与用户主键取出写入外部数据表,当禁用用户时通过用户id读取该key并通过sessionStore.destory将session销毁,强迫用户登出。 想请教各位老哥有没有更加优雅的实现方法?
你应该思考得更上层一些。需求是什么,要解决什么场景下的问题。我觉得没有场景是一定要用这种hack的方式才能解决的。 如果你想实现即时禁用用户的功能,就不应该依赖session,而是从数据库中读取权限。比如说用token来做用户认证而不是依赖session
鉴权 中间件里加上下面代码, 在需要的地方给用户的session 标记相应的状态
const ses = await ctx.app.redis.get(ctx.session._sessCtx.externalKey)
// console.log(val, JSON.parse(val))