如何申请 :session_limitable 在特定用户? (设计安全)

how to apply :session_limitable at a specific user ? (devise-security )

我使用 gem 货币安全 https://github.com/devise-security/devise-security 我申请: session_limitable 我的模型用户,效果很好。 但是我的模型用户有几个状态,我如何应用: session_limitable 仅适用于状态为 "mystatus" 的用户而不适用于其他用户? (不创建额外的模型)

class User< ApplicationRecord

 devise :session_limitable (only if user.status == "mystatus")

end

据我所知,gem 不提供每个对象的行为。 你要么得到全部,要么 none.

事实上,即使您想重载某些方法也不能,因为负责此功能的挂钩 (它们在这里定义:https://github.com/devise-security/devise-security/blob/master/lib/devise-security/hooks/session_limitable.rb

并没有真正按照让你去做的方式编写。

在你的位置我可能会:

  1. fork gem 并使其更可定制(并提交 PR)

  2. 有自己的自定义session_limitable解决方案(这看起来并不难)

因此这里所说的是一个您可能会觉得有用的 hacky 解决方案:

如果您重写 User 模型中的 respond_to? 方法并在其中包含一些自定义业务逻辑(例如检查用户状态),那么您可以创建在 Warden after_set_user 以您想要的方式行事。

def respond_to?(method_name, include_private = false)
  if method_name.to_s == 'unique_session_id' && self.status == 'mystatus'
    false
  else
    super
  end
end