Rails Rails 如何实现限定用户单点登陆,其他地方就掉线?

siriuszhuang · 2012年09月17日 · 最后由 huacnlee 回复于 2012年09月18日 · 4748 次阅读

现在 rails 的 session 是默认存入客户端的,这样服务器就无从下手踢掉之前登陆的 session。而且我不想依赖与类似 redis 或者 memcache 之类的外部服务。 不知道还有没有什么好办法。望赐教……

User 表里面增加一个 session_id 字段,ApplicationController 里面获取 @current_user 的方法里面检查 @current_user.session_id == session['session_id'] 另外,登陆成功以后将 session['session_id'] 写入用户的 session_id 字段里面

#1 楼 @huacnlee 谢谢你。但我觉得每次还要读取用户表比较不妥。 我是这样想的,cookie 上保存一个加密过的 token 和用户 ID,服务器 session 里面存一份 token 和用户 ID,登陆是自动重设 token。当请求是判断 cookie 的 token 和该用户的 session 上的 token 是否一样,不同则这个 token 失效,需要用户重新登陆。

#2 楼 @siriuszhuang 本来你每次 Controller 加载都需要检查当前用户的啊,不用用户栏的东西怎么出来?

#3 楼 @huacnlee 我之前是做 PHP 的,PHP 有一个框架叫做 Yii。Yii 重有一个组建叫做 WebUser,WebUser 可以理解为一个请求的用户,可以通过 Yii::app()->user 来调用,在一个请求重每次调用的都是同一个实例,可以用 Yii::app()->user->isGuest() 判断是否是登陆用户,用 Yii::app()->user->logout() 来将用户退出。WebUser 如果是登陆的,他只保存用户名和用户 ID,实际上,我们的大多数请求都只是需要验证请求的资源是不是属于这个 session 的用户的 ID,并不需要去查询用户表的。 所以我想要有一个类似 WebUser 的单列方法在 Rails 中使用,不知道有没有类似的模块组件。

#4 楼 @siriuszhuang 无状态多进程的模式下,用单例信息必须借助外部,不是数据库就是 redis 这样的缓存,这是由部署架构决定的

#5 楼 @fsword 你这一说才提醒了我

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