密码更新后使 Devise 用户会话标识符无效
Invalidating Devise user session identifier after password update
场景: 作为管理员,我需要在更新用户密码后使用户会话无效(注销)。这符合 https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html#Renew_the_Session_ID_After_Any_Privilege_Level_Change
的最佳实践
我正在使用 Devise,我在这里看到 有一个用于注销用户的配置:config.sign_in_after_reset_password = false
但是,我在 devise.rb
中启用了此配置,但用户仍保持登录状态。不确定这是为什么?
我也在使用 Redis 作为 session_store
Example::Application.config.session_store :cache_store,
key: '_example_session',
secure: true
是否可以在管理员重置密码后从 Redis 中删除特定用户的会话存储?如果是这样,我如何在 Redis 中找到他们的特定会话密钥?
标志 sign_in_after_reset_password
与 logout
用户完全无关,sign_in_after_reset_password = false
暗示如果用户自己更新他的帐户密码,则不会自动登录他的再次帐户,并且该逻辑仅在 PasswordsController#update 上发生。
所以你作为管理员尝试在自定义控制器中更改另一个用户的密码,当然它不是注销用户,无论 sign_in_after_reset_password
的值是什么。
devise
使用 gem warden
到 logout
用户(换句话说:销毁用户会话)和 warden
基于 request session
不是基于 database
,这意味着管理员无法重置另一个用户的会话,因此您不能仅通过 devise
强制注销另一个用户,您需要在设计之外处理此功能(例如将 session
添加到 user
table 或设计钩子 timeoutable)
您正在寻找的是设置 sign_in_after_change_password
,您应该将其设置为 false
(默认为 true
)。该方法的名称有点令人困惑——它的意思是“我们是否应该在更改密码后让用户登录”而不是“用户是否必须在更改密码后登录”。
参考文献:
场景: 作为管理员,我需要在更新用户密码后使用户会话无效(注销)。这符合 https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html#Renew_the_Session_ID_After_Any_Privilege_Level_Change
的最佳实践我正在使用 Devise,我在这里看到 有一个用于注销用户的配置:config.sign_in_after_reset_password = false
但是,我在 devise.rb
中启用了此配置,但用户仍保持登录状态。不确定这是为什么?
我也在使用 Redis 作为 session_store
Example::Application.config.session_store :cache_store,
key: '_example_session',
secure: true
是否可以在管理员重置密码后从 Redis 中删除特定用户的会话存储?如果是这样,我如何在 Redis 中找到他们的特定会话密钥?
标志 sign_in_after_reset_password
与 logout
用户完全无关,sign_in_after_reset_password = false
暗示如果用户自己更新他的帐户密码,则不会自动登录他的再次帐户,并且该逻辑仅在 PasswordsController#update 上发生。
所以你作为管理员尝试在自定义控制器中更改另一个用户的密码,当然它不是注销用户,无论 sign_in_after_reset_password
的值是什么。
devise
使用 gem warden
到 logout
用户(换句话说:销毁用户会话)和 warden
基于 request session
不是基于 database
,这意味着管理员无法重置另一个用户的会话,因此您不能仅通过 devise
强制注销另一个用户,您需要在设计之外处理此功能(例如将 session
添加到 user
table 或设计钩子 timeoutable)
您正在寻找的是设置 sign_in_after_change_password
,您应该将其设置为 false
(默认为 true
)。该方法的名称有点令人困惑——它的意思是“我们是否应该在更改密码后让用户登录”而不是“用户是否必须在更改密码后登录”。
参考文献: