Ruby on rails 无法使BCrypt自动验证生效
我正在尝试设置一个简单的iOS/Rails应用程序,在这里我可以创建一个用户,然后使用BCrypt对他们进行身份验证。我已尝试按照BCrypt的指示操作,但我的身份验证过程不起作用。rails非常新,所以我肯定我搞砸了一些简单的事情 要创建新用户,请执行以下操作: 在用户_controller.rb中Ruby on rails 无法使BCrypt自动验证生效,ruby-on-rails,basic-authentication,bcrypt,bcrypt-ruby,Ruby On Rails,Basic Authentication,Bcrypt,Bcrypt Ruby,我正在尝试设置一个简单的iOS/Rails应用程序,在这里我可以创建一个用户,然后使用BCrypt对他们进行身份验证。我已尝试按照BCrypt的指示操作,但我的身份验证过程不起作用。rails非常新,所以我肯定我搞砸了一些简单的事情 要创建新用户,请执行以下操作: 在用户_controller.rb中 # POST /users # POST /users.json def create @user = User.new(user_params) @user.password = use
# POST /users
# POST /users.json
def create
@user = User.new(user_params)
@user.password = user_params[:password]
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
def user_params
params.require(:user).permit(:username, :password)
end
def create
if @user = User.authenticate(params[:username], params[:password])
session[:user_id] = @user.id
render :show
else
flash.now[:alert] = "Invalid login/password combination"
render :action => 'fail'
end
end
在user.rb中
def password
@password ||= Password.new(password_hash)
end
def password=(new_password)
@password = Password.create(new_password)
self.password_hash = @password
end
def self.authenticate(username,password)
@user = User.find_by_username(username)
return @user.password == password
end
在服务器上:
于2014-08-21 19:32:05-0500为192.168.2.6启动POST/users.json
UsersControllercreate作为JSON进行处理
参数:{username=>testtest,password=>[FILTERED],user=>{username=>testtest}
0.1ms开始事务
User Exists 20.8ms从users.username='TestTestTest'限制为1的用户中选择1
为列密码\u哈希上的字符串类型插入的二进制数据
SQL 0.8ms插入到用户创建的地址、密码哈希、更新的地址、用户名值?、?、?、?[[创建时间:2014-08-22 00:32:05.960378],[密码散列,$2a$10$UzLdD7ytQXKRDU5MhAawJuFQ3R4oQlPyXh/V4GehNP692fsSpK6wK],[更新时间:2014-08-22 00:32:05.960378],[用户名,测试]]
1.3ms提交事务
渲染用户/show.json.jbuilder 0.3ms
完成了在136ms视图中创建的201个视图:31.9ms |活动记录:23.5ms
验证用户身份的过程包括:
在会话中_controller.rb
# POST /users
# POST /users.json
def create
@user = User.new(user_params)
@user.password = user_params[:password]
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
def user_params
params.require(:user).permit(:username, :password)
end
def create
if @user = User.authenticate(params[:username], params[:password])
session[:user_id] = @user.id
render :show
else
flash.now[:alert] = "Invalid login/password combination"
render :action => 'fail'
end
end
在user.rb中
def password
@password ||= Password.new(password_hash)
end
def password=(new_password)
@password = Password.create(new_password)
self.password_hash = @password
end
def self.authenticate(username,password)
@user = User.find_by_username(username)
return @user.password == password
end
服务器:
*于2014-08-21 19:38:26-0500开始192.168.2.6的课后/课时
SessionControllerCreate as处理/
参数:{username=>testtesttest,password=>[FILTERED],session=>{username=>testtesttest,password=>[FILTERED]}
用户加载0.2ms选择用户。*来自用户,其中users.username='testtesttest'限制为1
呈现会话/fail.json.jbuilder 0.2ms
在105ms视图中完成200 OK:23.3ms |活动记录:0.2ms*
非常感谢您的洞察力 基本上,Bcrypt用于加密密码 您可以在user.rb模型中使用以下方法来加密密码和验证用户
before_save :encrypt_password
def self.authenticate(name, password)
user = find_by_user_name(name)
if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
user
else
nil
end
end
def encrypt_password
if password.present?
self.password_salt = BCrypt::Engine.generate_salt
self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
end
end
谢谢我的代码还有一些其他问题,但这非常有帮助。