JAX-WS webservice和@rolesAllowed

时间:2012-01-31 13:27:10

标签: web-services security java-ee glassfish authorization

是否可以在JAX-WS Web服务上使用@RolesAllowed注释,如果可以,如何使用?

我在使用基本身份验证的glassfish 3.1.1上有一个web服务,但忽略了使用@RolesAllowed表达的限制。角色信息应该是可用的,因为我可以像这样访问它:

@Resource
WebServiceContext wsContext;

if (wsContext.isUserInRole("READ"))
log.info("Role: READ");

我获得了预期的角色,但即使@RolesAllowed设置为不同的角色,仍然可以访问所有方法。 @DenyAll效果不佳。

如果不支持这些注释,是否可以使用部署描述符来管理基于用户角色的Web服务方法访问?

修改: {JAVA EE 6教程的This部分描述了@RolesAllowed注释的用法。它读取

  

对于Java EE组件,您可以使用@DeclareRoles和@RolesAllowed元数据注释定义安全角色。

本教程的第一部分中未将Web服务列为Java EE组件,因此看起来不支持安全注释。

EDIT2 在Izan的帖子之后,我再试一次。这是我做的:

@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 感谢Izan和无数次尝试后我终于开始工作了。

如前所述,重点是通过添加@Stateless注释从普通Web服务切换到EJB Web服务。这允许使用安全注释。

此更改也需要更改部署描述符。虽然原始Web服务需要glassfish-web.xml来设置角色,但之后需要glassfish-ejb-jar.xml

2 个答案:

答案 0 :(得分:6)

也许这是一个非常愚蠢的问题,但是你的webservices EJB是什么?如Security Annotations and Authorization in GlassFish and the Java EE 5 SDK

中所述
  

注释@ PermitAll,@ DenyAll和@RolesAllowed被定义用于指定EJB业务方法的权限

我将这些注释与来自无状态EJB的自下而上的WS一起使用,它们就像JBoss中的魅力一样。


编辑1 @TPete 我会添加一些代码来向您显示我正在做的事情。

@Stateless
@WebService()
@WebContext(contextRoot = WSContextRoot.CTX_ROOT, 
    authMethod = "BASIC")
@EndpointConfig(configName = "Standard WSSecurity Endpoint")
@SecurityDomain(value = "myDeclaredDomain")
@RolesAllowed({ "AUTHORISED" })
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT)
public class MyWS implements MyInterface {
    @Override
    public void doSomething(){
        //impl
    }
}

至于界面

@Remote
@WebService
public interface MyInterface {

    @WebMethod(operationName="doSomething")
    public void doSomething(); 
}

WebContext,EndpointConfig和SecurityDomain是JBoss注释,但我认为GlassFish有类似的东西,或类似的方法。安全域包含在jboss的部署描述符中,并在login-config.xml中从JBoss的配置文件中定义。


编辑2 @TPete

我想你需要在Glass中添加一些EJB部署描述符,一个 sun-ejb-jar.xml 文件包在你的EAR中。同样,在答案中发布的同一篇文章中,有一个使用部署描述符章节说明

  

对于@RolesAllowed的EJB Web服务端点,您需要通过在 sun-中指定 元素来指定要使用的身份验证类型。 ejb-jar.xml中。对于用户名密码验证,请将元素设置为BASIC,如以下示例所示。此步骤仅对EJB Web服务端点是必需的,而EJB不是必需的。

由于您正在定义EJB Web服务端点,我认为您应该将此描述符放在EAR中。快速浏览一下这篇文章,它很好地描述了你所遵循的过程: - )

答案 1 :(得分:0)

最初的问题是陈旧的,但我仍然留下评论以防万一像我这样的人偶然发现它。从EJB 3.1开始,EJB可以打包在WAR模块中,但是在保护它们时,需要使用EJB部署描述符。规范中不清楚的是EJB可能不会在web.xml中声明为Servlet,否则应用程序将无法启动。

这是一篇关于在WAR模块中打包EJB以及与EJB JAR模块中的打包不同的优秀文章: http://pic.dhe.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic=%2Fcom.ibm.websphere.nd.multiplatform.doc%2Finfo%2Fae%2Fae%2Fcejb_ejbinwar.html