Таким образом, Джерси уже обрабатывает авторизацию для вас с помощью RolesAllowedDynamicFeature
. Просто зарегистрируйте его на своем Джерси ResourceConfig
. Нет необходимости в @DeclareRoles
, так как это механизм EJB. У Джерси есть своя отдельная система обработки ролей.
Что происходит под капотом, так это то, что есть ContainerRequestFilter
(с пометкой @Priority(Priorities.AUTHORIZATION)
), который проверяет ваши методы ресурсов, чтобы увидеть, какие роли разрешены, а затем получает SecurityContext
от ContainerRequestContext
и вызывает метод SecurityContext#isUserInRole(String role)
для каждой роли, объявленной в @RolesAllowed
(если она есть). Если SecurityContext
не прошел проверку, Джерси бросает ForbiddenException
.
Итак, с учетом сказанного вам нужно сделать для аутентификации создать ContainerRequestFilter
(с пометкой @Priority(Priorities.AUTHENTICATION
), и в этом фильтре выполнить аутентификацию, а затем создать SecurityContext
со всеми ролями для Джерси, чтобы проверить. Этот метод разделяет проблемы; один фильтр для аутентификации (который мы создали) и один фильтр для авторизации (который нам предоставляет Джерси.
Вы можете увидеть пример фильтра аутентификации, который использует Basi c Authentication в этой записи .