【问题标题】:uninitialized constant User::BCrypt (version related?)未初始化的常量 User::BCrypt (版本相关?)
【发布时间】:2016-04-30 19:57:11
【问题描述】:

我收到错误“未初始化的常量 User::BCrypt”。

我检查了这个问题:https://github.com/ryanb/nifty-generators/issues/68

捆绑安装的建议解决方案不起作用(当然,我经常捆绑安装)。

我检查了这个问题:https://github.com/codahale/bcrypt-ruby/issues/89

将 gem 更改为 'bcrypt-ruby' 而不仅仅是 'bcrypt' 的建议解决方案确实会将我的 gem 更新到较新的版本,但不能解决问题。

这是我的用户模型

class User < ActiveRecord::Base
  validates :username, :password_digest, :session_token, presence: true
  validates :session_token, uniqueness: true
  attr_reader :password

  def self.find_by_credentials(username, password)
    user = User.find_by_username(username)
    user.try(:valid_password?, password) ? user : nil
  end

  def valid_password?(password)
    BCrypt::Password.new(self.password_digest).is_password?(password)
  end

  def password=(password)
    @password = password
    self.password_digest = BCrypt::Password.create(password)
  end

  def reset_session_token
    self.session_token = SecureRandom.urlsafe_base64
    self.save!
    self.session_token
  end
end

【问题讨论】:

  • 请按照 codahale/bcrypt-ruby#89 上的建议将您的 bcrypt-ruby 更新到 3.1.5。

标签: ruby-on-rails bcrypt


【解决方案1】:

据我所知,我看不到在您的用户模型中需要“bcrypt”

require 'bcrypt'
class User < ActiveRecord::Base
 ...
end

【讨论】:

  • 好的,这解决了我的问题。我确信这不是必需的。我以前的项目没有它并且工作正常,但是,它确实有效,谢谢!
  • 关于这是否是新要求的任何消息?我很确定几周前我不需要这个。
  • 在此处的文档中表明它需要github.com/codahale/bcrypt-ruby
【解决方案2】:

除非您的应用程序纯粹用于学习目的,否则您应该认真考虑使用 Rails 中内置的 ActiveModel::SecurePassword

重新发明身份验证轮是最常见的安全故障之一。

# make sure your users table has a password_digest column!
class User < ActiveRecord::Base
  has_secure_password
end

您也不希望在数据库中的用户模型上存储会话令牌。相反,您应该使用 Rails 内置的会话机制。

rails 中间件在 cookie 中向所有访问者发出会话标识符。 cookie 只包含一个 32 字节长的 MD5 哈希,该哈希链接到会话存储(默认存储在另一个 cookie 中)。

您可以随时通过调用reset_session 使会话无效。

事实上,你的模型不应该以任何方式知道会话。

见:

【讨论】:

  • 任务是为了纯粹的学习目的推出自己的身份验证,是的。不过,感谢您引导我采用首选方法。
猜你喜欢
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多