Пусть /users/{id}
будет URL ресурса в службе RESTful.
Базовая аутентификация включена, и только аутентифицированные пользователи могут получить доступ к URL.
Пример сценария:
User_1
& User_2
являются аутентифицированными пользователями с userId 1 и 2.
Поскольку оба аутентифицированы, оба имеют доступ к
Но ожидается, что User_1
должен иметь доступ к /users/1
, а не к /users/2
или другому идентификатору пользователя.
Вопрос:
Как выполнить авторизацию на уровне ресурсов в сервисах RESTful?
Примечание: я реализую RESTful с использованием Jax-RS (с реализацией Apache CXF), полезно, если вы могли бы объяснить с помощью Jax-RS.
-Barath
Edit:
Как упоминал Донал, я не ищу авторизацию на основе ролей, а скорее авторизацию на уровне ресурсов.
Чтобы привести пример, скажем, / users / {id} / photos / {photoId} будет другим URL ресурса. Пользователю_1 должен быть предоставлен доступ к фотографиям, принадлежащим только ему. Если photoId 2 принадлежит user_2, то мы должны предоставить http_404 код ошибки для user_1 при запросе запроса / users / 1 / photos / 2. [Так как User_1 также является аутентифицированным пользователем, он может вызывать / users / 2 / photos / 2, поэтому мы должны идентифицировать идентификатор пользователя по параметрам аутентификации, а не по URL ресурса]
Единственное решение, которое я могу придумать, - включить уникальный идентификатор, который определяет авторизацию в каждом запросе, например,
Вместо SELECT * FROM PHOTO_TBL WHERE PHOTO_ID=2;
использовать SELECT * FROM PHOTO_TBL, USER_TBL WHERE PHOTO_ID=2 AND USER_ID=1 AND USER_ID=PHOTO_ID;
с помощью этих ресурсов доставляются данные, принадлежащие конкретному пользователю. [Должен быть механизм, предотвращающий изменение уникального идентификатора на стороне клиента, который используется для принятия решения об авторизации (в данном случае userId), поскольку все запросы являются запросами STATELESS]
Предупреждение: Каждый запрос должен быть достаточно интеллектуальным, чтобы понимать проблемы безопасности и включать дополнительное соединение. Это плохой дизайн для привязки логики безопасности к каждой бизнес-функции.
Мне еще предстоит изучить безопасность Spring и то, как ее можно использовать в этом случае.