Если подумать, ресурс User
, который видит клиент администратора (со всеми видимыми полями), точно такой же ресурс , который видит анонимный или менее привилегированный клиент.URI идентичен, но представление , которое они видят, отличается.
Это похоже на то, что клиентский запрос должен быть закодирован в JSON вместо XML через заголовок Accept
: сервер может согласиться удовлетворить этот запрос, но это не обязательно.В вашем случае сервер должен вернуть представление, соответствующее предоставленным учетным данным клиента.
Следовательно, администратор может получить контент в типе носителя application/vnd.yourcompany.user.full+xml
в качестве тела, возвращаемого GET на вашем User
ресурс, и он будет содержать все возможные поля.
Однако анонимный пользователь может получить полезную нагрузку, закодированную как, скажем, application/vnd.yourcompany.user.limited+xml
, которую ваша документация будет четко описывать как представление, которое может содержать или не содержать все элементы версии full
.Клиенту пришлось бы использовать гибкий декодер или схему, которые допускали бы отсутствие определенных элементов вообще.
Кроме того, вы можете вернуть всю информацию о ресурсе, но использовать значение специального поля, чтобы указать, что конкретное значение было отредактировано:
<user>
<id>jimbob</id>
<real-name>--FORBIDDEN--</real-name>
</user>
Можно создать тип носителя для каждой роли, ноэто привело бы к сильной связи между вашей схемой безопасности и вашими представлениями, и это, вероятно, нежелательно.Гибкие схемы представления, в которых используются пропуски полей или редактирование значений, будут более удобными для поддержки в долгосрочной перспективе.
Окончательное решение, которое необходимо принять, заключается в том, следует ли возвращать ссылки на другие ресурсы, которые не будут доступны для навигации на основе учетных данныхклиент поставляется.По моему мнению, эти ссылки должны всегда возвращаться, даже если эти учетные данные не будут работать.Зачем?Потому что клиент может теоретически предоставить другие учетные данные при вызове этих URI.Даже если они этого не сделают, итоговая проблема 401
может привести к тому, что клиент в итоге предоставит их.Но если они никогда не получат URI, им будет запрещено принимать это решение.