Ruby on rails 无法使BCrypt自动验证生效

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

我正在尝试设置一个简单的iOS/Rails应用程序,在这里我可以创建一个用户,然后使用BCrypt对他们进行身份验证。我已尝试按照BCrypt的指示操作,但我的身份验证过程不起作用。rails非常新,所以我肯定我搞砸了一些简单的事情

要创建新用户,请执行以下操作:

在用户_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: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 

谢谢我的代码还有一些其他问题,但这非常有帮助。