¿Es posible utilizar la anotación @RolesAllowed
en un servicio web JAX-WS y, en caso afirmativo, cómo?JAX-WS webservice y @rolesAllowed
Tengo un servicio web en glassfish 3.1.1 usando Basic Authentication pero las restricciones expresadas usando @RolesAllowed
se ignoran. La información debe estar disponible papel, como puedo acceder a él de esta manera:
@Resource
WebServiceContext wsContext;
if (wsContext.isUserInRole("READ"))
log.info("Role: READ");
recibo el papel que se espera, pero todavía todos los métodos son accesibles, incluso si @RolesAllowed
se establece en función diferente. @DenyAll
no está funcionando tan bien.
Si estas anotaciones no son compatibles, ¿es posible usar descriptores de implementación para administrar el acceso a los métodos del servicio web en función de las funciones de los usuarios?
Editar: This parte de la 6 tutorial JAVA EE describe el uso de @RolesAllowed
anotación. Se lee
Para los componentes de Java EE, usted define los roles de seguridad utilizando las anotaciones de metadatos @DeclareRoles y @RolesAllowed.
servicios Web no aparecen como componentes de Java EE en la primera parte del tutorial, lo que parece que las anotaciones de seguridad no son compatibles.
Edit2 Después de la publicación de Izan, le di otra oportunidad. Esto es lo que hice:
@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!";
}
}
Usando este tipo de configuración, todos pueden acceder al método, sin importar los roles que se establezcan. Los usuarios se autentican (pueden ver eso en audit.log) pero no se realiza ninguna autorización. Como se indicó anteriormente, puedo acceder a la función desde WebServiceContext
(en realidad hago la autorización manual usando esta información).
Añadiendo la anotación @Stateless
, vamos a usar las anotaciones de seguridad. Entonces @permitAll
funciona como se esperaba. Pero el uso de roles aún no funciona, ya que el usuario no se autentica ahora. Aparecen como ANONYMOUS
en el registro de auditoría y se les niega el acceso.
Mi web.xml
se parece a esto:
<?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
acaba de mapas de nombres de roles a los nombres de grupos, así:
<security-role-mapping>
<role-name>READ</role-name>
<group-name>READ</group-name>
</security-role-mapping>
Editar 3 Gracias a Izan e innumerables intentos más tarde por fin lo tengo trabajando.
Como dije antes, el punto principal fue cambiar de un servicio web simple a un servicio web EJB al agregar la anotación @Stateless
. Esto permite usar las anotaciones de seguridad.
Este cambio también es necesario para cambiar los descriptores de despliegue. Mientras que el servicio web original requirió un glassfish-web.xml
para configurar los roles, se requiere un glassfish-ejb-jar.xml
posteriormente.
Lo sentimos, tal vez podría haber publicado esto como una edición en lugar de una respuesta. – igracia
Creo que publicarlo como un comentario sería lo más apropiado, aunque hasta que tengas 50 representantes no es posible – Flexo
@Izan Supongo que no, aunque este es mi primer proyecto Java EE y no estoy tan familiarizado con la terminología. Tal vez publicar un ejemplo podría aclarar el problema. Solo uso la anotación '@ Webservice' en este momento. Intenté combinarlo con '@ Stateless', pero luego no pude acceder al servicio web utilizando Https. – TPete