Можно ли использовать аннотацию @RolesAllowed
в веб-сервисе JAX-WS и если да, то как?
У меня есть веб-сервис на glassfish 3.1.1, использующий Basic Authentication, но ограничения, выраженные с помощью @RolesAllowed
, игнорируются. Информация о роли должна быть доступна, так как я могу получить доступ к ней следующим образом:
@Resource
WebServiceContext wsContext;
if (wsContext.isUserInRole("READ"))
log.info("Role: READ");
Я получаю ожидаемую роль, но все методы доступны, даже если @RolesAllowed
установлен на другую роль. @DenyAll
также не работает.
Если эти аннотации не поддерживаются, можно ли использовать дескрипторы развертывания для управления доступом к методам веб-сервиса на основе ролей пользователей?
Edit:
В этой части учебника по JAVA EE 6 описывается использование аннотации @RolesAllowed
. Она гласит
Для компонентов Java EE вы определяете роли безопасности с помощью аннотаций метаданных @DeclareRoles и @RolesAllowed.
Веб-службы не перечислены как компоненты Java EE в первой части руководства, поэтому похоже, что аннотации безопасности не поддерживаются.
Edit2 После сообщения Изана я попробовал еще раз. Вот что у меня получилось:
@Webservice
@DeclareRoles(value = {"READ", "UPDATE", "DELETE"})
public class ServiceImpl implements Service {
@Override
@WebMethod(operationName = "helloWorld")
@RolesAllowed({"NONE"})
public String helloWorld() throws Exception {
return "Hello World!";
}
}
При такой настройке все могут получить доступ к методу, независимо от того, какие роли установлены. Пользователи проходят аутентификацию (это видно в audit.log), но авторизация не происходит. Как указано выше, я могу получить доступ к роли из WebServiceContext
(я фактически делаю ручную авторизацию, используя эту информацию).
Добавление аннотации @Stateless
позволяет мне использовать аннотации безопасности. Таким образом, @permitAll
работает, как и ожидалось. Но использование ролей по-прежнему не работает, поскольку пользователи теперь не проходят аутентификацию. Они отображаются как ANONYMOUS
в журнале аудита, и доступ им запрещен.
Мой web.xml
выглядит так:
OneMore
WebServiceSecurity
Authorized users only
/service
POST
READ
UPDATE
DELETE
BASIC
READ
UPDATE
DELETE
Glassfish-web.xml
просто сопоставляет имена ролей с именами групп, вот так:
READ
READ
Edit 3. Благодаря Izan и бесчисленным попыткам я наконец-то добился того, что это работает.
Как уже говорилось, основным моментом был переход от обычного веб-сервиса к веб-сервису EJB путем добавления аннотации @Stateless
. Это позволяет использовать аннотации безопасности.
Это изменение потребовало изменения дескрипторов развертывания. Если для первоначального веб-сервиса требовался glassfish-web.xml
для настройки ролей, то после этого требуется glassfish-ejb-jar.xml
.