1

我的模型:

class User < Sequel::Model
self.raise_on_save_failure = false
plugin :validation_helpers
def validate
    super
    validates_format /@/, :email
    validates_presence [:email, :password]
    validates_unique :email
end

def before_save
    super
    self[:password] = BCrypt::Password.create(self[:password])
end

结尾

但是当我更新用户时,我的密码哈希两次。我知道这是因为before_save钩子,但我想继续sequel验证 (validates_presence) 真实密码,而不是 bcrypt 哈希的结果(原因BCrypt::Password.create('')不为空)

所以我需要以某种方式下一步:

  1. 检查密码是否更改
  2. 验证真实密码sequel
  3. 保存我的密码的 bcrypt 哈希
4

2 回答 2

2

我认为你应该重新考虑你的工作流程。如果您希望仅在尝试更新数据库时捕获无效输入,为什么不这样做:

post '/update' do
  ...

  if params[:password] == nil || params[:password].empty?
    password = nil
  else
    password = BCrypt::Password.create(params[:password])
  end

  # I have no idea how this line should really look like in your code
  User.find(param[:id]).set(:password, password)

  ...
end

因此,基本上,如果密码字段未发送或为空,则将其设为 nil。

正如 iain 在评论中非常清楚地指出的那样:

[...] 您应该只使用 Sequel 来验证数据库已经或将要保存的数据。真正的密码应该由业务逻辑层验证,这就是这个答案中发生的事情。

于 2014-02-09T11:00:33.903 回答
0

您可以像这样在类方法中检查它:

  if user.password_digest != expected_password
    user = nil
  end
于 2016-06-28T09:27:21.383 回答