Rails has_secure_password身份验证错误

时间:2014-02-19 15:41:46

标签: ruby-on-rails

这是我的用户:

class User < ActiveRecord::Base
  has_secure_password
end

这是有人可以通过API进行身份验证的方式:

module Api
  class SessionsController < ApiController
    def create
      user = User.find_by_email(params[:user][:email])
      if user && user.authenticate(params[:user][:password])
        # some login logic
      else
        render json: {messages: user.errors.full_messages}, status: :unauthorized
      end
    end
  end
end

如果我传递了错误的密码,我会按预期获得401 Unauthorized。但是,user.errors为空。如何访问has_secure_password身份验证错误?

2 个答案:

答案 0 :(得分:2)

仅在活动记录错误中填充验证错误。密码不正确不是验证错误。为什么不能明确设置消息,因为唯一可能的错误是电子邮件/密码无效

module Api
  class SessionsController < ApiController
    def create
      user = User.find_by_email(params[:user][:email])
      if user && user.authenticate(params[:user][:password])
        # some login logic
      else
        render json: {messages: ["Invalid Email or Password"]}, status: :unauthorized
      end
    end
  end
end

答案 1 :(得分:1)

这很容易做到。简而言之,在User模型上放置一个方法(在此示例中称为password_verified),如果authenticate失败,则会添加错误。

# app/models/user.rb
def password_verified(password)
  verified = authenticate(password)
  errors.add(:password, 'is invalid') unless verified
  verified
end

现在,而不是致电authenticate来电password_verified。你的例子看起来像这样:

module Api
  class SessionsController < ApiController
    def create
      user = User.find_by_email(params[:user][:email])
      # Here is where we call our wrapper method instead of authenticate
      if user && user.password_verified(params[:user][:password])
        # some login logic
      else
        render json: {messages: user.errors.full_messages}, status: :unauthorized
      end
    end
  end
end

这就像使用自定义验证器一样使用ActiveModel :: Errors,因此它有很好的文档记录(即Rails指南,ActiveRecord验证,errors.add)。虽然我在这里将password_verified放在用户模型上,但它可以像服务或关注点一样。