Rails和BCrypt的问题has_secure_password

时间:2017-02-20 02:04:56

标签: ruby-on-rails ajax activerecord controller bcrypt

我对Rails很陌生,所以我可能错过了一些明显的东西,但是我正忙着让bcrypt的has_secure_password工作。

我正在尝试通过来自React前端的axios AJAX调用来注册用户。数据正在正确传递,我没有任何CORS问题,因为当我删除has_secure_password行(并在所有适用位置替换:password :password_digest)时,用户进入数据库 - 只是没有加密密码。我已经整理了一堆以前的问题& has_secure_password&上的答案似乎没什么用。

以下是我尝试创建新用户时服务器吐出的内容:

1| Started POST "/api/users" for 127.0.0.1 at 2017-02-19 20:51:19 -0500
2| Processing by Api::UsersController#create as HTML
3|   Parameters: {"name"=>"test", "username"=>"test25", "email"=>"test@test.com", "password"=>"[FILTERED]", "user"=>{"name"=>"test", "username"=>"test25", "email"=>"test@test.com"}}
4|    (0.1ms)  BEGIN
5|    (0.1ms)  ROLLBACK
6| Completed 200 OK in 11ms (Views: 0.3ms | ActiveRecord: 4.2ms) 

(尽管对最后一行感到乐观,但用户没有进入数据库。另外,请注意第3行后半部分中缺少的password信息。)

这是我的用户模型:

class User < ApplicationRecord
  has_secure_password
end

我也尝试在ActiveRecord::Base使用ApplicationRecord并在其中添加include ActiveModel::SecurePassword,但两者都没有做任何事情。

这是我的创建用户控制器(这有点乱,因为我不是100%确定我在做什么):

def create
  user = User.new(user_params)
  if user.save
    session[:user_id] = user.id
    render json: { user: user }
  else
    render json: {error: "there was an error"}
  end
end

private
def user_params
  params.require(:user).permit(:name, :username, :email, :password)
end

AJAX调用将密码发送为password: [password here],我的表中有:password_digest列。任何诊断错误的帮助都将非常感激。

感谢阅读!

已编辑添加

在ruby控制台中创建用户可以正常工作

1 个答案:

答案 0 :(得分:2)

好。我不喜欢这个解决方案,但最终工作了:

添加没有user_params定义的用户。

class UsersController < ApplicationController
    def index
    end

    def create
      user = User.new({name: params[:name], username: params[:username], password: params[:password], email: params[:email]})
      if user.save
        render json: { user: user }
      else
        render json: {error: user.errors.full_messages}
      end
    end

  end

我仍然想知道为什么这种情况发生了,因为它看起来很奇怪&amp;违反直觉的行为,我认为拥有user_params定义是更好的做法。

编辑:感谢有用的朋友,我发现问题实际上是我从前端发送AJAX调用的方式。我把它设置成这样:

axios.post('/users', {
    name: e.target.name.value,
    password: e.target.password.value,
    other_option: e.target.option.value
 }).then((res) => { /* do some stuff */ })
   .catch((err) => console.log(err));

当我发送的对象真的应该是......

axios.post('/users', {
    user: {
        name: e.target.name.value,
        password: e.target.password.value,
        other_option: e.target.option.value
     }, 
  }).then((res) => { /* do some stuff */ })
   .catch((err) => console.log(err));

...从......开始......

def user_params
  params.require(:user).permit(:name, :username, :other_option)
end

...它希望请求正文有一个对象:user