密码更新后使 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_passwordlogout 用户完全无关,sign_in_after_reset_password = false 暗示如果用户自己更新他的帐户密码,则不会自动登录他的再次帐户,并且该逻辑仅在 PasswordsController#update 上发生。 所以你作为管理员尝试在自定义控制器中更改另一个用户的密码,当然它不是注销用户,无论 sign_in_after_reset_password 的值是什么。

devise 使用 gem wardenlogout 用户(换句话说:销毁用户会话)和 warden 基于 request session不是基于 database,这意味着管理员无法重置另一个用户的会话,因此您不能仅通过 devise 强制注销另一个用户,您需要在设计之外处理此功能(例如将 session 添加到 user table 或设计钩子 timeoutable)

参考:https://github.com/heartcombo/devise/issues/5262

您正在寻找的是设置 sign_in_after_change_password,您应该将其设置为 false(默认为 true)。该方法的名称有点令人困惑——它的意思是“我们是否应该在更改密码后让用户登录”而不是“用户是否必须在更改密码后登录”。

参考文献: