Gem devise 同一个帐号再次登陆,把之前登陆的挤下去

guyanbiao · 2013年02月21日 · 最后由 ericliu 回复于 2013年03月08日 · 3996 次阅读

想做一个下线通知,就和 qq 的下线通知类似,现在的认证用 devise。大家有什么办法啊?我弄了一天没想通

1 楼 已删除
2 楼 已删除
3 楼 已删除

这是 sso?

@i5ting 尼还是再看看单点登录的含义吧

把 session 存到服务器端就可以了

#6 楼 @ywencn 我试啦,现在卡在不知道怎么通过 user id 找到他的 session,session 的 data 是加密的

我这是这么干的,每次登录后在内存数据库里生成一个 key value,key 就是用户 id,value 就是一个随机的 token,当 token 发生变化后有两种方案处理反馈,一种是当新的请求发生的时候去检查 key value 是否匹配,然后把结果返回到新的请求页面,还有一种如果你想做及时通知的话你可以建一个推送服务器,推送服务器我采用的是 SSE 协议,SSE 协议对服务器压力相对来说比较小,因为是短连接,但有个缺点是现在的浏览器大部分都不支持 LAST_EVENT_ID,兼容性不大好,不过其实不做推送用户体验也不会差到哪去

User 表里面加一个 last_logined_session_id 字段,登录以后修改它为 Session 的编号 current_user 获取到以后对比一下 last_logined_session_id 不一致就登出

@huacnlee 恩,这个方法比较简单

我是采用 10 楼的方案做的,不知道还有没有更好的方法。

#12 楼 @ericliu 按你的需求 10 楼就很好了。如果用了 ActiveRecord session store,可以指定一个类,可以参考 SessionSqlBypass 的实现。自己往 session 表里加个 user_id 的字段,然后保存 session 的时候把 session[:user_id]data 里取出来存到数据库里。

#10 楼 @huacnlee 是要在 application controller 加一个 before_filter 么,要不怎么把旧的登出去?

@guyanbiao 我采用的是和你一样的方式来做的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号