Как представить контроль доступа на уровне атрибутов RESTful?

Я ломал себе голову и гуглил целую вечность, так и не придумав удовлетворительного способа справиться с этим. Я хочу написать красивую полностью RESTful-службу для возврата ресурсов, но данные, которые у вас есть, для чтения (или записи) самых разных ресурсов в зависимости от вашей роли. Так, например, пользователь может видеть свой личный номер телефона в своем профиле, как и администратор сайта, но не другой пользователь. Анонимный посетитель может не видеть настоящее имя другого пользователя, но другие пользователи (и администратор сайта) могут это видеть. Существует около 4 или 5 уровней доступа и правил, определяющих, какие атрибуты могут быть прочитаны или записаны. Я доволен написанием, поскольку клиент может ПОСТАВИТЬ изменения, а сервер не обязан принимать их все (или вообще), но чтение - это моя проблема.

<user>
 <id>jimbob</id>
 <real-name>Jim Roberts</real-name> <!-- only logged-in users should see this -->
 <phone-number>+1 42424151</phone-number> <!-- only the user and admin users should see this -->
</user>

Я хочу иметь правильно кэшируемый ресурс профиля пользователя, который содержит все общедоступные данные, но как мне смоделировать все, что могут видеть только определенные пользователи? Я мог добавить до 4 ссылок на дополнительную информацию, большинство из которых возвращало бы несанкционированные ошибки для большинства пользователей, при этом каждая ссылка содержала дополнительную информацию, относящуюся к роли. Но это кажется очень неэффективным, а также привязывает клиентов к концепции ролей, когда раньше все, о чем им нужно было знать, - это пользователи.Есть ли какие-нибудь лучшие идеи?

<user>
 <id>...</id>
 <link rel="more" href="extra-user-profile-data-for-logged-in-users"/>
 <link rel="more" href="extra-user-profile-data-for-senior-users"/>
 <link rel="more" href="extra-user-profile-data-for-admin-users"/>
 <link rel="more" href="extra-user-profile-data-for-superadmin-users"/>
</user>

Обратите внимание - я не борюсь ни с одним из

  • Аутентификация
  • Контроль доступа на уровне ресурсов
  • Реализация контроля доступа или авторизации на стороне сервера

Я борюсь с

  • Как представить ресурсы, которые на «нормальном» HTML-сайте будут отличаться для разных людей, по-настоящему RESTful способом.

Это похоже на действительно распространенную проблему, которая должна быть у всех, но я ничего не могу найти по ней! Пожалуйста помоги!

12
задан Gareth Boden 22 December 2011 в 17:50
поделиться