【问题标题】:Custom user authentication on Rails 4Rails 4 上的自定义用户身份验证
【发布时间】:2013-11-04 04:04:35
【问题描述】:

我正在尝试通过 Ruby on Rails 4.0 学习和使用我自己的用户模型和身份验证,但大多数教程(如果不是全部)似乎在最近的更新中已经过时。它们中的任何一个都没有描述的方法有效。我完全一无所知,这是我的用户模型:

class User
  include Mongoid::Document
  field :login, type: String
  field :hash, type: String
  field :salt, type: String
  field :email, type: String
  field :name, type: String

  before_save :hash_password

  validate :login, presence: true, uniqueness: true, length: { in: 4..24 }
  validate :password, presence: true, confirmation: true, length: { in: 8..32 }
  validate :email, presence: true
  validate :name, presence: true

  def hash_password
    if password.present?
      self.salt = BCrypt::Engine.generate_salt
      self.hash = BCrypt::Engine.hash_secret(password, salt)
    end
  end
end

还有控制器:

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user
    else
      render 'new'
    end
  end

  def new
    @user = User.new
  end

  private
    def user_params
      params.require(:user).permit(:login, :password, :password_confirmation, :email, :name)
    end
end

然后我在保存用户时收到UnknownAttribute 错误。我错过了什么?哪些字段有误?

【问题讨论】:

  • 使用has_secure_password 并完成它......
  • @meagar 有什么好的攻略吗?我是 Ruby 和 Rails 的新手。此外,如果需要,Mongo 不使用 ActiveRecord。
  • 它是否试图将明文password保存到数据库中?
  • @micahbf 它根本不起作用,我得到它来保存明文密码,但我之前无法让它散列。
  • @ranisalt 你能发布整个错误吗?

标签: ruby-on-rails ruby ruby-on-rails-4 mongoid authentication


【解决方案1】:

你需要添加:

attr_accessor :password

现在您正在尝试使用密码属性,但 rails 对此一无所知。 attr_accessor 允许您在本地使用密码属性,但不会将其持久化到数据库中(这很好)。

【讨论】:

  • 另外,如果除了注册或登录之外的任何时候都使用该模型,password 存在验证将是一个问题。
  • attr_accessor 现在已弃用,取而代之的是.require.permit method,我在控制器中使用了它(更新了帖子)
【解决方案2】:

您可以关注rail casts episode。我知道它有点旧,但几个月前我也使用过它,对于 rails 4,您可以简单地“允许”属性而不是使用“attr_accessible”,因为 rails 4 不支持 attr_accessible。

【讨论】:

    【解决方案3】:

    我设法使它工作。我没有弄清楚“未知属性”错误是怎么回事,但我将模型更改为使用方法has_secure_password,它自动获取我的:password:password_confirmed参数,bcrypts并保存到@987654324 @字段。

    class User
      include Mongoid::Document
      include ActiveModel::SecurePassword # important, imports has_secure_password
      field :login, type: String
      field :password_digest, type: String
      has_secure_password
      field :email, type: String
      field :name, type: String
    
      validate :login, presence: true, uniqueness: true, length: { in: 4..24 }
      validate :password, presence: true, confirmation: true, length: { in: 8..32 }
      validate :email, presence: true, uniqueness: true
      validate :name, presence: true
    end
    

    完成后,我收到以下错误:

    can't activate bcrypt-ruby (~> 3.0.0), already activated bcrypt-ruby-3.1.2. Make sure all dependencies are added to Gemfile.
    

    尽管 bcrypt 已正确添加到我的 Gemfile 中,但显然 has_secure_password 需要特定版本的 gem 3.0.x,所以我强制它:

    gem 'bcrypt-ruby', '~> 3.0.0'
    

    这下载了按预期工作的版本 3.0.1(不是 3.0.0)。我希望他们尽快修复此版本的不兼容问题。

    感谢所有答案。这个项目将在我完成后开源:)

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多