2016-04-30 20 views
1

我收到錯誤「未初始化的常量User :: BCrypt」。未初始化的常量User :: BCrypt(版本相關?)

我查了一下這個問題:https://github.com/ryanb/nifty-generators/issues/68

建議的解決方案捆綁安裝不工作(當然,我經常捆綁安裝)。

我查了一下這個問題:https://github.com/codahale/bcrypt-ruby/issues/89

建議的解決方案來改變寶石,而不是「bcrypt-紅寶石」只是「bcrypt」會更新我的寶石到較新的版本,但沒有解決問題。

這裏是我的用戶模型

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 
+1

上codahale/bcrypt-紅寶石#89建議請更新您的bcrypt,紅寶石3.1.5。 – Sravan

回答

4

從我可以看到我不能看到你的用戶模型都要求「bcrypt」

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

好的,這解決了我的問題。我確定這不是必需的。我以前的項目沒有它,工作得很好,但是,它的工作如此,謝謝! –

+0

關於這是否是新要求的任何說法?我很確定幾周前我不需要這個。 –

+1

在這裏的文檔表明它需要https://github.com/codahale/bcrypt-ruby – Shani

0

除非你的應用程序純粹是爲了學習的目的,你應該認真考慮使用內置於導軌中的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在任何時候使會話無效。

事實上,您的模型不應該以任何方式意識到會話。

參見:

+0

這個任務是爲了純粹的學習目的推出自己的認證,是的。感謝您將我列入首選方法。 –

相關問題