我想我现在真的坚持了 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”只能由“开发人员”访问,而不是“测试人员”:
@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”来完成这项工作。我尝试了很多方法,但这个注释根本不起作用(注释被忽略)。请帮忙。