2011-09-06 79 views
4

我有一个在Tomcat 6下部署的webservice,它可以很好地工作。 现在我想authentificate任何客户端,而是通过URL保持WSDL公开存取像 http://localhost:8080/services/MyService?wsdl如何限制访问除wsdl以外的所有内容?

我试图解决这个问题这样(Web应用程序的web.xml中),但它不工作:

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>WSDL access - to anybody</web-resource-name> 
     <url-pattern>/services/MyService?wsdl</url-pattern> 
    </web-resource-collection> 

    <auth-constraint><role-name>*</role-name></auth-constraint>  
</security-constraint> 

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Some authentification required</web-resource-name> 
     <url-pattern>/services/MyService</url-pattern> 
    </web-resource-collection> 

    <auth-constraint><role-name>somebody</role-name></auth-constraint>   
</security-constraint> 

我现在看到的唯一解决方案是创建附加的servlet并授予访问WSDL的权限。无论是否验证,servlet都会将所需的wsdl传递给客户端。在这种情况下,WSDL URL不会被忽略,所以我不喜欢这个解决方案。请提供其他建议吗?

+0

只是好奇,但如果你扭转秩序会发生什么? – cwallenpoole

+0

没有什么变化。手册指出将使用第一个匹配模式,因此顺序是正确的。 –

回答

7

我有类似的问题,我找到了解决方案。通过POST调用WebServices方法,而通过GET获取WSDL。所以解决方案是只限制POST访问。

security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Some authentification required</web-resource-name> 
     <url-pattern>/services/MyService</url-pattern> 
     <http-method>POST</http-method> 
    </web-resource-collection> 
    <auth-constraint><role-name>somebody</role-name></auth-constraint>   
</security-constraint> 

我使用WebSphere 7 JAXWS,但web.xml配置是所有容器和appservers相同。

+0

这篇文章也可以是有用的:http://stackoverflow.com/questions/8069640/whitelist-security-constraint-in-web-xml –

1

你想有传输层安全性。如果您尝试使用的WS-Security保护您的个人服务 - 你可以保持WSDL开放而被固定服务...

+0

-1:错误,与提问者需要相反。 – bdares

+2

没有它不相反。他希望保持wsdl的开放并保护所有其他服务。 –

+0

这不是相反的。这就是你如何保护服务,但仍然保持wsdl打开。 –

0

我有一个应用程序设置这种方式。我有一个登录页面,用户名和密码对用户进行身份验证。只有当有效的用户登录时,他们才有权访问数据和页面。任何与WSDL的连接都不会受到影响,因为它将由WSDL函数调用进行处理。

相关问题