Веб-сервис JAX-WS и @rolesAllowed
Можно ли использовать@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
требуется впоследствии.