注释@RolesAllowed不适用于Tomcat 7.0.32中部署的Web Service

时间:2012-11-14 02:52:37

标签: java web-services annotations jax-ws tomcat7

我想我现在真的坚持了4个小时。 我有一个在JAX-WS中开发的示例Web服务,我已经在web.xml中成功配置了BASIC身份验证,但我无法让“@RolesAllowed”的消息工作。这个注释被简单地忽略了。 我正在使用servlet 3.0 API和tomcat 7.0.32,所以我认为应该支持@RolesAllowed。

以下是我的代码: 在Web.xml中,我有以下配置:

<security-constraint>
    <display-name>SecurityConstraint</display-name>
    <web-resource-collection>
        <web-resource-name>ApexeWebServiceCollection</web-resource-name>
        <description>These resources are only accessible by authorised client.</description>
        <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description>These are the roles who have access.</description>
        <role-name>developer</role-name>
        <role-name>tester</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description>This is how the user data must be transmitted.</description>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>default</realm-name>
</login-config>
<security-role>
    <description>Service developer</description>
    <role-name>developer</role-name>
</security-role>
<security-role>
    <description>Service tester</description>
    <role-name>tester</role-name>
</security-role>

然后我在服务端实现了以下方法。我想要方法:“sayNumber”只能由“developer”访问,而不是“tester”:

@SchemaValidation(handler = SchemaValidationErrorHandler.class) @WebService(endpointInterface =“com.webservice.HelloWorld”)

公共类HelloWorldImpl实现HelloWorld {

@Resource
WebServiceContext wsContext;

@Override
@WebMethod
@RolesAllowed("developer")
public int sayNumber(double number) throws SOAPException {
    MessageContext messageContext = wsContext.getMessageContext();
    boolean isAllowed=wsContext.isUserInRole("developer");
    System.out.println("Authorization:"+isAllowed);
    return (int) ++number;
}

}

然后在Spring配置中(是的,我也使用Spring 3.1.2)我有以下内容来连接URI和服务:

<wss:binding url="/hello">
    <wss:service>
        <ws:service bean="#helloWorldWebService"
            bindingID="http://www.w3.org/2003/05/soap/bindings/HTTP/" />
    </wss:service>
</wss:binding>

接下来,我使用客户端来调用此Web服务。客户端使用“tester”角色的用户名和密码。我可以看到该服务正在打印“Authorization:false”,因为HelloWorldImpl中的代码:

boolean isAllowed=wsContext.isUserInRole("developer");
    System.out.println("Authorization:"+isAllowed);

当然,我可以在这里抛出一个例外,让测试人员退出。但是,我希望注释“@RolesAllowed”来完成这项工作。我尝试了很多方法,但这个注释根本不起作用(注释被忽略)。 请帮忙。

0 个答案:

没有答案