如何使 rails 设计应用程序上的用户会话无效?
How can I invalidate a session of a user on a rails devise app?
我想创建一个将使用户会话无效的端点。
我知道设计有 destroy_user_session
路由会破坏用户会话。但是从管理员的角度来看,我该如何为特定用户做到这一点呢?设计存储会话数据在哪里?
Where does devise store session data?
Devise 将使用您的 Rails 应用配置使用的会话存储。使用的密钥取决于您在 config/routes.rb
文件中传递给 devise_for
的内容 - 这被称为 Devise 映射。参见 Devise::Controller::Rememberable。
Rails 中的默认会话存储从至少 Rails 4 开始就一直是 ActionDispatch::CookieStore,因此会话实际上是通过在客户端之间来回传递加密的 cookie 来“存储”的和服务器。这比替代方案的性能要好得多。
因此,您实际上无法在使用 cookie 存储时“使”或破坏其他用户会话,因为它不是您实际控制的东西。您可以简单地通过更改应用程序密码使所有用户 cookie 无效,这将导致 Rails 拒绝任何现有的会话存储 cookie 并发布新的。
如果您希望能够实现这样的功能,您需要将会话存储后端更改为服务器端存储,例如 Redis or ActiveRecord which will actually let you find a session for a specific user and delete it. Before doing so you should read up as much as possible about how sessions work in Rails and the basics of how Devise together with Warden 处理用户身份验证,因为您需要扎实地掌握它才能实现功能。还应考虑性能影响,因为它会影响您的整个应用程序。
我想创建一个将使用户会话无效的端点。
我知道设计有 destroy_user_session
路由会破坏用户会话。但是从管理员的角度来看,我该如何为特定用户做到这一点呢?设计存储会话数据在哪里?
Where does devise store session data?
Devise 将使用您的 Rails 应用配置使用的会话存储。使用的密钥取决于您在 config/routes.rb
文件中传递给 devise_for
的内容 - 这被称为 Devise 映射。参见 Devise::Controller::Rememberable。
Rails 中的默认会话存储从至少 Rails 4 开始就一直是 ActionDispatch::CookieStore,因此会话实际上是通过在客户端之间来回传递加密的 cookie 来“存储”的和服务器。这比替代方案的性能要好得多。
因此,您实际上无法在使用 cookie 存储时“使”或破坏其他用户会话,因为它不是您实际控制的东西。您可以简单地通过更改应用程序密码使所有用户 cookie 无效,这将导致 Rails 拒绝任何现有的会话存储 cookie 并发布新的。
如果您希望能够实现这样的功能,您需要将会话存储后端更改为服务器端存储,例如 Redis or ActiveRecord which will actually let you find a session for a specific user and delete it. Before doing so you should read up as much as possible about how sessions work in Rails and the basics of how Devise together with Warden 处理用户身份验证,因为您需要扎实地掌握它才能实现功能。还应考虑性能影响,因为它会影响您的整个应用程序。