如何申请 :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)
并没有真正按照让你去做的方式编写。
在你的位置我可能会:
fork gem 并使其更可定制(并提交 PR)
有自己的自定义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
我使用 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)
并没有真正按照让你去做的方式编写。
在你的位置我可能会:
fork gem 并使其更可定制(并提交 PR)
有自己的自定义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