Подтвердить что ты не робот

Различные ресурсы ресурса REST, основанные на привилегиях пользователя

Я хочу предоставить разные ответы на один и тот же вопрос для разных пользователей на основе прав доступа. Я прочитал этот вопрос:

Исключение личных данных в ответе RESTful

Но я не согласен с принятым ответом, в котором говорится, что вы должны предоставить как /people.xml, так и /unauthenticated/people.xml, так как мое понимание REST заключается в том, что конкретный ресурс должен жить в определенном месте, а не несколько в зависимости от сколько интересующей вас информации.

Система, которую я проектирую, еще сложнее, чем эта. Скажем, что пользователь создал несколько кругов друзей и назначил им разные права доступа. Например, мой круг "знакомых" может иметь доступ к моему дню рождения, и мой "профессиональный" круг может иметь доступ к моей истории занятости, но не наоборот. Чтобы применить ответ из вопроса, который я упомянул, мне нужно иметь способ получить все пользовательские круги (которые я могу хранить в секрете по соображениям безопасности), а затем пройти через /circles/a/users/42, /circles/b/users/42, /circles/c/users/42 и т.д., а затем объединить результаты, чтобы отобразить максимальный объем доступной информации. Очевидно, что не обязательно один круг, который получает всю информацию, которую получает любой из других кругов. Я считаю, что это достаточно сложно (обратите внимание, что мне, вероятно, нужно сделать это с несколькими типами объектов и что в будущих версиях может потребоваться другая процедура), но что, если я хочу наложить ограничения безопасности для определенного пользователя , несмотря на факт, что он тоже в некоторых моих кругах? Может ли эта проблема даже быть решена? Даже если я откажусь ответить на любой из вышеупомянутых запросов и придумаю новый, который может дать мне ответ, он все равно покажет, что этот конкретный пользователь обрабатывается по-разному из-за индивидуальных ограничений доступа.

Что мне здесь не хватает? Возможно ли даже создание веб-сервиса RESTful?

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

4b9b3361

Ответ 1

В соответствии с диссертацией Филдинга (это действительно замечательное письмо):

Ресурс представляет собой концептуальное сопоставление с множеством сущностей, а не с сущностью, которая соответствует отображению в любой конкретный момент времени.

Другими словами, если у вас есть ресурс, который определен как "запрашивающие пользовательские проекты" и его представления, доступные с помощью URI /projects, вы не нарушаете никаких ограничений REST, возвращая один список проектов ( т.е. представление) для пользователя A и другое (представление) для пользователя B, когда они GET тот же URI. Таким образом, интерфейс является однородным/согласованным.

В дополнение к этому, REST только предписывает включить в ответ явную инструкцию кэширования, будь то "кеш для этого долгого" или "вообще не кэшировать":

Кэш-ограничения требуют, чтобы данные в ответе на запрос были неявно или явно помечены как кэшируемые или не кэшируемые.

Как вы решаете управлять, это зависит от вас.

Помня об этом,

Вам следует чувствовать себя комфортно, возвращая представление ресурса, которое меняется в зависимости от пользователя, запрашивающего представление определенного ресурса, если вы не нарушаете ограничений единого интерфейса - don Используйте один идентификатор ресурса, чтобы возвращать представления разных ресурсов.

Если это помогает, считайте, что сервер также отвечает на различные представления ресурса - XML ​​или JSON, французский или английский и т.д. Учетные данные, отправленные с запросом, являются еще одним фактором, который сервер может использовать при определении какое представление отправить в ответ. Это то, что для заголовка есть.

Ответ 2

Я согласен, что другое решение кажется неправильным. Это делает структуру URL сложной и сложной для поиска ресурса. Однако, если вы правильно выполнили REST, не должно иметь значения, какой URL-адрес для ресурса указан, как сервер контролирует его (и может свободно перемещать его по своему усмотрению). Если ваш клиент действительно "REST", он будет обнаруживать ресурсы, необходимые для предварительного согласования с сервером. Таким образом, путь действительно не имеет значения на клиенте. Мне это не нравится, потому что это сбивает с толку - не из-за какого-то нарушения принципов REST.

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

Для самого алгоритма обычно используется алгоритм наименьшего или наиболее ограничительного типа, который объединяет допустимые данные в ответ (очень похожий на java-сферы или модель безопасности пользователя Microsoft).

Если данные структурированы по-разному для ограниченного/не ограниченного случая, вы можете создать два разных представления данных и вернуть, которые когда-либо были разрешены пользователю. В любом случае клиент должен запрашивать принятые типы ответов mime, и он просто предоставит разные ответы на основе безопасности сеанса в заголовке запроса. В качестве альтернативы вы можете предоставить необязательные элементы с представлениями и заполнить соответствующую базу на авторизацию (хотя, на мой взгляд, это немного хак-ээ).