Исключение личных данных в ответе RESTful - PullRequest
7 голосов
/ 12 июля 2010

Каков наилучший метод исключения определенных полей / данных в ответе RESTful, если запрашивающий его пользователь не сможет увидеть все данные?

Пример:

Лицо имеет Имя , Фамилия и Дата рождения .

Как прошедшие проверку, так и не прошедшие проверку пользователи могут отправлять запросы RESTful в /people.xml, чтобы получить полный список людей. Тем не менее, только прошедшие проверку пользователи могут просматривать всю информацию. Пользователям, не прошедшим проверку подлинности, должны возвращаться только поля «Имя» и «Фамилия» (исключая данные о дате рождения).

Должен ли контроллер Person проверять аутентификацию перед построением ответа? Если пользователь аутентифицирован, он получает все, иначе он получает только подмножество? Нарушает ли это какие-либо правила REST, когда /people.xml может отправлять два отдельных результата?

Ответы [ 5 ]

16 голосов
/ 14 июля 2010

Нет, все в порядке.Это тот же ресурс, но с другими представлениями, основанными на информации аутентификации.Вы также можете обслуживать разные версии в зависимости от того, что содержит заголовок Accept (кстати, вы должны использовать его вместо расширений, таких как .xml), или вы можете обслуживать разные языковые версии, или вы можете сделать страницу отличной, если в журналеу пользователя определены конкретные параметры персонализации.Это все законно.Рассмотрим веб-сайт с полем для входа.Если вы вошли в систему, страница будет другой.Это то же самое, за исключением того, что оно не влияет конкретно на вложенную информацию как таковую.Контроль кеширования и так далее в этих случаях - именно то, для чего нужны Cache-Control, Vary и друзья.Также см. http://www.subbu.org/blog/2007/12/vary-header-for-restful-applications

4 голосов
/ 13 июля 2010

Один и тот же URL может выдавать разные представления в зависимости от заголовков запроса. Например, Accept обычно используется для управления форматом ответа (например, XML или JSON). Аналогично, заголовки аутентификации могут использоваться для контроля того, сколько возвращается для объекта.

0 голосов
/ 12 июля 2010

Вы можете использовать опцию :only метода to_xml, чтобы ограничить поля, возвращаемые контроллером, т. Е .:

def show
  @person = Person.find(params[:id])
  payload = current_user.nil? ? @person.to_xml(:only => 
                  [:first_name, :last_name, :dob]) : @person

  respond_to do |format|
    format.xml  { render :xml => payload }  
  end    
end

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

class Person
  serialize_with_options(:anonymous) do
    only   :first_name, :last_name, :dob
  end
end


class PersonController
  def show
    @person = Person.find(:params[:id])
    respond_to do |format|
      format.xml { render :xml => current_user.nil? ? @person.to_xml(:anonymous):
                             @person   }
    end    
  end
end

Ссылка

1 serialize_with_options

0 голосов
/ 13 июля 2010

Учтите, что разные представления одних и тех же данных (в зависимости от пользователя) могут иметь неожиданные последствия, если у вас есть кэш где-то посередине. Если пользователь с полной аутентификацией сначала делает запрос, а затем «меньший» пользователь, он может увидеть неожиданный результат: то же представление, что и у полностью аутентифицированного пользователя. Это связано с тем, что нет никакой разницы в двух запросах в том, что касается кеша (если вы не сообщите об этих проблемах). Итак, действуйте осторожно.

Я бы также предложил отдельные пространства имен, как предложил Роберт.

0 голосов
/ 12 июля 2010

Согласно книге REST говорит, что один ресурс должен возвращать один и тот же результат при каждом запросе.

Я бы создал пространство имен с "unauthenticated" или чем-то еще и сделал бы

/ people.xmlauthenticated

и

/ unauthenticated / people.xml

Это может быть один и тот же контроллер, создающий разные результаты xml для каждого запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...