2013-05-28 3 views
1

У меня есть приложение rails, которое принимает запрос json для создания пользователя. Знак_учка в основном является GET. Я не могу создать пользователя, когда я передаю этот url http://localhost:3000/sign_up.json?username=chalam&[email protected]&name=chalami&password=chalami Я знаю, что я передаю пароль в открытую, но это меня не касается. я проверил журналы и это то, что я вижуНевозможно передать данные параметров для создания пользователя

Started GET "/sign_up.json?username=chalam&[email protected]&name=chalami&password=[FILTERED]" for 127.0.0.1 at 2013-05-28 10:37:37 +0700 
Processing by UsersController#create as JSON 
Parameters: {"username"=>"chalam", "email"=>"[email protected]", "name"=>"chalami", "password"=>"[FILTERED]"} 
(0.1ms) begin transaction 
User Exists (0.1ms) SELECT 1 AS one FROM "users" WHERE "users"."username" IS NULL LIMIT 1 
User Exists (0.0ms) SELECT 1 AS one FROM "users" WHERE "users"."email" IS NULL LIMIT 1 
(0.0ms) rollback transaction 
(0.0ms) begin transaction 
CACHE (0.0ms) SELECT 1 AS one FROM "users" WHERE "users"."username" IS NULL LIMIT 1 
CACHE (0.0ms) SELECT 1 AS one FROM "users" WHERE "users"."email" IS NULL LIMIT 1 
(0.0ms) rollback transaction 
Completed 200 OK in 6ms (Views: 0.1ms | ActiveRecord: 0.3ms) 

Как вы можете видеть, хотя параметр Parameters: {"username"=>"chalam", "email"=>"[email protected]", "name"=>"chalami", "password"=>"[FILTERED]"} ясно показывают, что параметры пропускают, они не вводятся в базу данных CACHE (0.0ms) SELECT 1 AS one FROM "users" WHERE "users"."username" IS NULL LIMIT 1 CACHE (0.0ms) SELECT 1 AS one FROM "users" WHERE "users"."email" IS NULL LIMIT 1 Основная проблема заключается данные из Params не используется «для создания пользователя»

Следует отметить, что я могу создать пользователя через консоль в терминале. Я буду стараться, чтобы включить всю необходимую информацию рельсы версия: 3.2.13 и Я использую тонкие вместо WEBBRICK

Мой user.rb

class User < ActiveRecord::Base 
    attr_accessible :email, :name, :username 
    attr_accessor :password 
    before_save :encrypt_password 

    validates_uniqueness_of :username, :email 
    validates_presence_of :password, :on => :create 
    validates_presence_of :email, :username 

    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 

    def self.authenticate(username, password) 
user = find_by_username(username) 
if(user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)) 
    user 
else 
    nil 
end 
    end 
end 

Мой контроллер

class UsersController < ApplicationController 
respond_to :json 
    def new 
@user = User.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    @user.save 
    if @user.save 
    respond_to do |format| 
     format.json { render :json => {:status => "200", :message => "Signed up successfully"}} 
    end 
    else 
    respond_to do |format| 
     puts @user.errors.inspect 
     format.json { render :json => {:status => "400", :message => "Failed"}} 
    end 
    end 
    end 

    def index 
@user = User.all 
render :json =>@user 
    end 
end 
+4

1) Где ваш контроллер код? 2) Пожалуйста, отформатируйте свой код, чтобы он не был просто супом кода. 3) Вы * создаете * ресурс по запросу * GET *, подрывая среду, в которой у Rails есть настройка, позволяющая вам создавать RESTful-приложения. 4) Вы передаете пароль в чистом виде, препятствуя собственной безопасности, небрежно. См. № 3. – coreyward

+0

Кстати, Rails уже поддерживает безопасные хэшированные пароли с 'has_secure_password', чтобы убедиться, что вы не делаете кучу ошибок, которые вы совершаете (например, повторное хеширование вашего пароля при каждом сохранении). – coreyward

+0

Вы используете драгоценный камень? – visnu

ответ

0

Хорошо, поэтому я придумал решение, и я думал, что должен опубликовать его, это может помочь людям.

Проблема: я не смог создать пользователя с помощью J ответ сына, хотя я мог бы сделать это с помощью rails console

Ошибки:

  1. Я создал маршрут GET, чтобы создать пользователя, который компрометирует Security
  2. Я добавил поле пароля attr_accessor и не attr_accessible

Решения:

  1. изменил действие с GET на POST (в route.rb). Чтобы создать пользователя (для POST), я использовал curl. В моем случае мое заявление curl было curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d ' {"user":{"name":"name","username":"username","email":"[email protected]","password":"app123"}}' http://localhost:3000/sign_up. Вот полезный пост о curl

2.In моей модели пользователя я включил attr_accessor :password, а также attr_accessible :password

Смежные вопросы