Ruby on Rails密码验证

Chr*_*nch 14 validation ruby-on-rails

所以我有一些有趣的密码验证要求:

  • 当用户注册时,我希望他们必须输入密码并确认并介于两者之间6..40(GOT THIS WORKING 100%)

  • 当用户更新其个人资料时,适用相同的验证规则(GOT THIS WORKING 100%)

  • 当管理员添加用户时,他们只需输入一次密码就应该验证(NOT WORKIG)

  • 当管理员编辑用户并且密码字段为空时,它不应更新密码,如果输入密码,则应验证密码.(部分工作)

    validates :password, :presence => true,
                       :confirmation => true,
                       :length => {:within => 6..40},
                       :unless => :force_submit
    
    Run Code Online (Sandbox Code Playgroud)

我无法覆盖的唯一情况是,当管理员添加用户时,它未经过验证,当管理员编辑用户(并输入密码)时,它不会被验证.

:force_submit在从管理形式传递,所以密码没有被验证.(所以更新空密码的情况有效)

任何想法/魔术?

Chr*_*nch 29

以下似乎符合我的要求...我实际上现在要求所有用户确认..(它使视图更清洁).但是在更新中,我允许空白.

  validates :password, :presence => true,
                       :confirmation => true,
                       :length => {:within => 6..40},
                       :on => :create
  validates :password, :confirmation => true,
                       :length => {:within => 6..40},
                       :allow_blank => true,
                       :on => :update
Run Code Online (Sandbox Code Playgroud)


Tom*_*ord 28

在接受的答案上略微构建,这是我在Rails项目中使用的代码.(注意:我们devise用于处理用户身份验证和devise_invitable创建新用户.)

PASSWORD_FORMAT = /\A
  (?=.{8,})          # Must contain 8 or more characters
  (?=.*\d)           # Must contain a digit
  (?=.*[a-z])        # Must contain a lower case character
  (?=.*[A-Z])        # Must contain an upper case character
  (?=.*[[:^alnum:]]) # Must contain a symbol
/x

validates :password, 
  presence: true, 
  length: { in: Devise.password_length }, 
  format: { with: PASSWORD_FORMAT }, 
  confirmation: true, 
  on: :create 

validates :password, 
  allow_nil: true, 
  length: { in: Devise.password_length }, 
  format: { with: PASSWORD_FORMAT }, 
  confirmation: true, 
  on: :update
Run Code Online (Sandbox Code Playgroud)

  • @Arif说实话,从安全的角度来看,我的实际建议是使用强大的库,如[zxcvbn](https://github.com/envato/zxcvbn-ruby)来检查密码熵,而不是试图自己重新实施安全检查. (2认同)
  • 但是,如果您有一个特定的,明确定义的"安全要求"列表(例如,如果客户端坚持您的密码策略符合其任意标准),那么我的建议是编写[自定义验证器类](http: //guides.rubyonrails.org/active_record_validations.html#performing-custom-validations)明确处理每个场景.(不要忽视添加单元测试!) (2认同)