Можно ли использовать @RolesAllowed
аннотацию в веб-сервисе JAX-WS и если да, то как?
У меня есть веб-служба Glassfish 3.1.1, использующая базовую аутентификацию, но ограничения, выраженные с помощью @RolesAllowed
, игнорируются. Информация о роли должна быть доступна, так как я могу получить к ней доступ следующим образом:
@Resource
WebServiceContext wsContext;
if (wsContext.isUserInRole("READ"))
log.info("Role: READ");
Я получаю ожидаемую роль, но все методы доступны, даже если для @RolesAllowed
установлена другая роль. @DenyAll
тоже не работает.
Если эти аннотации не поддерживаются, возможно ли использовать дескрипторы развертывания для управления доступом к методам веб-сервиса на основе ролей пользователей?
Редактировать :
Эта часть руководства по 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
выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>OneMore</display-name>
<security-constraint>
<display-name>WebServiceSecurity</display-name>
<web-resource-collection>
<web-resource-name>Authorized users only</web-resource-name>
<url-pattern>/service</url-pattern>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>READ</role-name>
<role-name>UPDATE</role-name>
<role-name>DELETE</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<security-role>
<role-name>READ</role-name>
</security-role>
<security-role>
<role-name>UPDATE</role-name>
</security-role>
<security-role>
<role-name>DELETE</role-name>
</security-role>
</web-app>
Glassfish-web.xml
просто сопоставляет имена ролей с именами групп, например:
<security-role-mapping>
<role-name>READ</role-name>
<group-name>READ</group-name>
</security-role-mapping>
Редактировать 3
Благодаря Изану и бесчисленным попыткам позже я, наконец-то, заработал.
Как уже было сказано, основным моментом было переключение с простого веб-сервиса на веб-сервис EJB путем добавления аннотации @Stateless
. Это позволяет использовать аннотации безопасности.
Это изменение требуется также для изменения дескрипторов развертывания. В то время как исходный веб-сервис требовал glassfish-web.xml
для настройки ролей, впоследствии потребуется glassfish-ejb-jar.xml
.