ActiveModel::SecurePassword
提供安全加密密码的功能, 这个模块提供 has_secure_password 类方法, 它定义了一个名为 password 和一个名为 password_confirmation 的属性, 而且有相应的数据验证, 但是 has_secure_password 只在对象创建时对密码进行验证. 之后的操作便不再验证 (例如 update), 这个可以接受, 因为这意味着你可以从数据库加载用户, 在不知道密码的情况下修改和保存用户.
1. 使用要求
gemfile 中添加 gem bcrypt
ActiveModel::SecurePassword
依赖 https://github.com/codahale/bcrypt-ruby , 所以要再 gemfile 中加入这个 gem,
ActiveModel::SecurePassword
才能正确运行.
模型中增加 password_digest 字段
为了使用安全密码, 模型中必须定义一个 password_digest 字段, 用来存储加密后的密码.
rails g migrate add_password_digest_to_persons
...
2. 提供验证
has_secure_password 类方法会默认为 password 属性添加如下述数据验证
密码存在验证
密码等于确认密码验证 (使用
password_confirmation
属性)
密码的最大长度为 72(
ActiveModel::SecurePassword
依赖的 bcrypt 的要求)
has_secure_password 类方法会为
password_confirmation
属性, 提供密码一致性的验证方法
但是必须要在 model 中添加
validates_confirmation_of :password
只有当该属性
password_confirmation
为非 nil 值时才触发验证. 如果该属性非 nil, 则其值必须与 password 属性相等 (也就是 rails 不强制使用密码一致性验证, 但是如果个人需要使用可以按如上方法添加)
示例
- class Person
- include ActiveModel::SecurePassword
- #这会为 model 增加两个属性, password 和 password_confirmation, 这两个属性属于 model 但是并不存在于数据库中, 所以我们在数据库中并不需要存储密码明文
- has_secure_password
- #在 has_secure_password 对 password 属性提供的基础的验证方法之外添加额外密码长度的验证
- validates :password, :length => { :minimum => 5 }
- end
- person = Person.new
- # 密码为空时
- person.valid? # => false
- # 密码确认与密码不匹配时
- person.password = 'aditya'
- person.password_confirmation = 'nomatch'
- person.valid? # => false
- # 密码长度超过 72 时
- person.password = person.password_confirmation = 'a' * 100
- person.valid? # => false
- # 只有密码, 没有密码确认
- person.password = 'aditya'
- person.valid? # => true
- # 所有数据验证都通过时
- person.password = person.password_confirmation = 'aditya'
- person.valid? # => true
3. 免验证
当我们通过第三方应用登录的用户, 是不需要密码的, 就可以添加参数
validations: false
移除验证规则
has_secure_password :validations => false
来源: http://www.jianshu.com/p/2a8a4b4b9389