Ruby on rails 3.1 在rails 3.1中重写密码摘要验证时使用了安全密码

Ruby on rails 3.1 在rails 3.1中重写密码摘要验证时使用了安全密码,ruby-on-rails-3.1,Ruby On Rails 3.1,因此,我希望允许在has_secure_password中使用空密码,但查看ActiveModel::SecurePassword似乎是硬编码的: validates_presence_of :password_digest 唯一的方法是使用猴子补丁吗?如果你想要一个空密码,为什么要包含has\u secure\u密码?如果你接受空密码,为什么要实现密码。不管怎么说,你总是可以实现自己的摘要方法,而不必使用has\u secure\u password。使用BCrypt,有一个Rail

因此,我希望允许在has_secure_password中使用空密码,但查看ActiveModel::SecurePassword似乎是硬编码的:

validates_presence_of     :password_digest

唯一的方法是使用猴子补丁吗?

如果你想要一个空密码,为什么要包含has\u secure\u密码?如果你接受空密码,为什么要实现密码。不管怎么说,你总是可以实现自己的摘要方法,而不必使用has\u secure\u password。使用BCrypt,有一个Railscast 250身份验证,从零开始,你就可以看到它在起作用,我认为has\u secure\u password不会像你发现的那样满足你的需要

因此,不必使用has_secure_password,您可以编写自己的密码,基本上是复制源代码并“fork”它来执行您想要的操作——仅当#user不是nil时生成并验证密码,这听起来像是您想要的


或者,正如JTomari所建议的,您可以创建一个员工模型和一个用户模型——您可以使用ActiveRecord的“单表继承”功能使它们仍然位于同一个表中,并拥有一个公共的超类,您仍然可以获取它们(例如,Account.find以返回符合您的条件的员工和用户)。在某些方面,这是一个“更干净”的解决方案,尽管它增加了幕后ActiveRecord内容的复杂性——在过去,单表继承有点问题,我认为它们现在表现良好。(我自己有一段时间没用过了)

我刚刚遇到一个相关问题,并使用:if运算符进行验证

validates :password ,..., :if => :employee_needs_password?
validates :password_confirmation , ... , :if => :employee_needs_password?

def employee_needs_password?
   # check whatever your condition is and return true/false 
end

是的,这正是我问上述问题的原因。。。在我的系统中,有些员工需要用户名(因此是密码字段),有些员工不需要用户名。然后,为需要身份验证的员工创建一个没有身份验证的用户模型和一个帐户模型