Devise CanCan не может создать пользователя через сообщение при использовании Curl - PullRequest
1 голос
/ 07 января 2011

Я следовал руководству Тони Амояла Аутентификация Rails с Devise и CanCan часть 2 - Ресурсы Restful для администраторов и создал контроллер пользователя.

У меня включена аутентификация на основе токенов иCanCan настроен так, чтобы разрешить доступ только администраторам для выполнения чего-либо полезного.

Примечания к фрагментам кода:

class User < ActiveRecord::Base
  before_save :ensure_authentication_token

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :token_authenticatable

  attr_accessible :company_name, :role, :email, :password, :password_confirmation, :remember_me

  ROLES = %w[admin customer]  
end

class UsersController < ApplicationController
  before_filter :get_user, :only => [:index,:new,:edit]
  load_and_authorize_resource

  ...
end

class Ability
    include CanCan::Ability

    def initialize(user)
      user ||= User.new # guest user

      if user.role == "admin"      
        can :manage, :all
      elsif user.role == "customer"
        can :address, :lookup
        cannot [:new, :create, :edit, :update, :destroy, :index], [User]
        can [:show], [User], :id => user.id
      end
    end    
end

Теперь, когда я использую curl для выполнения запросов GET, PUT & DELETE, все работает,Обратите внимание на параметр auth_token (это токен пользователя-администратора)

curl -k -H "Content-Type: application/json" -X GET https://localhost:3000/users.json?auth_token=Z6Sgkd65w1oCWckpNrdya54FkHy6sMgWLn1BNno7wa9xSEi0xvoxfrRD4Y8z -i

Похоже, что POST-запросы не работают и перенаправляются, что указывает на то, что аутентификация не запускается с использованием предоставленного токена.

Почтовый запрос:

curl -k -H "Content-Type: application/json" -X POST https://localhost:3000/users -d '{"auth_token":"Z6Sgkd65w1oCWckpNrdya54FkHy6sMgWLn1BNno7wa9xSEi0xvoxfrRD4Y8z", "user":{"company_name":"Test","role":"customer","password":"XXXXXXXX","password_confirmation":"XXXXXXXX","email":"test8@test.com"}}' -i

Журнал разработки:

Started POST "/users" for 127.0.0.1 at Fri Jan 07 18:54:27 +1100 2011
  Processing by UsersController#create as */*
  Parameters: {"auth_token"=>"Z6Sgkd65w1oCWckpNrdya54FkHy6sMgWLn1BNno7wa9xSEi0xvoxfrRD4Y8z", "user"=>{"company_name"=>"Test", "password_confirmation"=>"[FILTERED]", "role"=>"customer", "password"=>"[FILTERED]", "email"=>"test8@test.com"}}
Completed   in 88ms
Redirected to https://localhost:3000/

Неправильно ли использование Curl?или жеНужно ли сначала войти в систему, а затем установить сеанс в файле cookie в запросе POST?или жеЯ делаю несколько глупых обезьян?

Я довольно новичок в Rails & Ruby, поэтому любая помощь очень ценится.Спасибо.

1 Ответ

0 голосов
/ 08 сентября 2011

добавить это к вашему контроллеру:

# disable csrf protection for the controller: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html
  skip_before_filter :verify_authenticity_token

Это говорит контроллеру не проверять токен подлинности формы, который Rails ожидает при получении POST.

...