我安装了bcrypt
和bcrypt-ruby
宝石并尝试:
class User < ActiveRecord::Base
before_save :encrypt
def encrypt
password = BCrypt::Password.create(:password)
end
end
def create
@user = User.new(user_params)
if @user.save
redirect_to "http://bookworm.az:3000"
end
end
但它并没有在BCrypt中拯救。我好像,我做错了什么。在github社区中写道:add require&#39; bcrypt&#39;在用户模型的顶部,在类User&lt;之前ActiveRecord :: Base但在这种情况下,我的应用程序将保存在数据库bcrypt
中以获取所有字段。
任何人都可以帮助我吗?
答案 0 :(得分:0)
这很容易使用宝石,例如Devise(它做了很多)或Sorcery(它做得少,所以可能更容易理解和改变你喜欢的。)
如果你想自己编写代码,我个人就是这样做的。
# The file is ./app/models/password_attribute.rb
require 'bcrypt'
module PasswordAttribute
# Read the :password attribute as a new BCrypt::Password.
# Return the BCrypt::Password.
def password
BCrypt::Password.new(password_before_type_cast)
end
# Write the :password attribute as a new BCrypt::Password.
def password=(plain_text)
write_attribute(:password,BCrypt::Password.create(plain_text))
end
end
然后是用户模型:
class User
include PasswordAttribute
...
end
用法:
user=User.new
user.password='secret' # automatically converts plain text to bcrypt
user.save
用户密码有效吗?
if user.password=='secret'
# password is valid
else
# password is invalid
end
获取并设置:
u.password='secret'
=> user's password is now secret
u.password=='secret'
=> true
u.password=='xxx'
=> false
答案 1 :(得分:0)
def encrypt
self.password = BCrypt::Password.create(:password)
end
您正在为加密方法定义本地变量密码,您需要使用self.password
访问class属性,这就是为什么它不保存加密密码。