在我的应用程序中,只有管理员可以创建新的用户记录。通过电子邮件向用户发送激活链接,用户可在其中设置其密码。
我想使用has_secure_passord方法(railscast):
class User < ActiveRecord::Base
has_secure_password
...
end
效果很好,但是当管理员创建验证失败的记录时,它会自动验证密码digest...so的存在。是否有一种方法可以跳过自动添加的password_digest验证,而不跳过我添加的其他验证?
发布于 2012-05-04 22:24:50
我决定进行自己的自定义身份验证。以下解决方案将仅在设置密码时验证密码。这使管理员无需添加密码即可创建用户。
class User < ActiveRecord::Base
include BCrypt
attr_accessor :password, :password_confirmation
validates :password, length: (6..32), confirmation: true, if: :setting_password?
def password=(password)
@password = password
self.password_hash = Password.create(password)
end
def authenticate(password)
password.present? && password_hash.present? && Password.new(password_hash) == password
end
private
def setting_password?
password || password_confirmation
end
end
如果有人发布的答案允许我仍然使用has_secure_password
方法,我将改为接受它。
发布于 2013-05-23 13:10:03
从rails的4.X版本开始,has_secure_password
采用了一个选项:验证。如果将其设置为false
,则不会运行验证。
gem的3.X版本不支持此参数。但是,您可以从支持此参数的latest 4.0.XRC code向后移植activemodel/lib/active_model/secure_password.rb。
因此,您的代码将如下所示:
class User < ActiveRecord::Base
has_secure_password :validations => false
...
end
发布于 2012-05-04 12:07:19
没有办法跳过验证,但是编写您自己的方法版本将非常容易,它允许您传递一个参数来确定是否验证password_digest字段的存在。
只需像在SecurePassword module中一样(通过ActiveSupport::Concern
)扩展ActiveModel
,并添加您自己的安全密码方法。
即
module ActiveModel
module MySecurePassword
extend ActiveSupport::Concern
module ClassMethods
def my_has_secure_password(validate_password_digest=true)
# you custom logic
end
end
end
end
https://stackoverflow.com/questions/10442466
复制相似问题