Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在设备上更改密码后终止所有用户会话_Ruby On Rails_Session_Devise_Warden - Fatal编程技术网

Ruby on rails 在设备上更改密码后终止所有用户会话

Ruby on rails 在设备上更改密码后终止所有用户会话,ruby-on-rails,session,devise,warden,Ruby On Rails,Session,Devise,Warden,当用户更新密码时,我希望使他们的所有会话(如在手机或其他浏览器上)无效,并向当前设备发送一个新会话。 只要我打个电话就行了 注销@user;登录@user,它似乎可以工作 然而,除了实际实施Desive#sign#u out和Warden#logout方法之外,我找不到支持这一说法的文件 是否有更干净或更好的记录解决方案 谢谢大家! 要在Rails中创建新会话,请使用reset\u session 在Rails会话中,使用会话标识符,该标识符存储在服务器上,并由客户端作为cookie存储rese

当用户更新密码时,我希望使他们的所有会话(如在手机或其他浏览器上)无效,并向当前设备发送一个新会话。 只要我打个电话就行了
注销@user;登录@user
,它似乎可以工作

然而,除了实际实施Desive#sign#u out和Warden#logout方法之外,我找不到支持这一说法的文件

是否有更干净或更好的记录解决方案


谢谢大家!

要在Rails中创建新会话,请使用
reset\u session

在Rails会话中,使用会话标识符,该标识符存储在服务器上,并由客户端作为cookie存储
reset_session
从服务器中删除标识符(针对当前用户),并发出新标识符。服务器不会接受任何先前存在的会话存储cookie,也不会将其反序列化到
会话中


我建议阅读,因为它对会话在Rails中的实际工作方式有一个非常好的概述。

注意,Desive/Warden实际上自己就能很好地处理这个问题。Warden不会撤销会话标识符。相反,它只是从会话中删除序列化用户(用户id或存储的任何声明)。这需要用户重新登录。但是,如果您使用默认的CookieStore会话存储机制,则无法轻松地从所有设备撤消会话。这是因为会话链接到该特定设备持有的会话标识符,并且存储在该设备上。因此,不可能知道哪些会话标识符链接到用户记录。如果使用数据库存储/memcached,您可以查询数据库并删除会话。非常感谢您的回答!
reset_session
是否使给定用户的所有其他会话过期?否,它将使该设备的会话过期。rails会话将设备持有的cookie链接到服务器上的标识符。因此,服务器只知道请求中使用的会话标识符属于该用户。如果需要从多个设备注销用户,则需要使用服务器会话存储机制,而不是cookies,并删除服务器上的会话数据。