如何限制除了wsdl之外的所有内容?

时间:2011-09-06 04:43:27

标签: java web-services security tomcat wsdl

我在Tomcat 6下部署了一个Web服务,它运行得很好。 现在我想验证任何客户端,但通过URL保持wsdl公共访问 http://localhost:8080/services/MyService?wsdl

我试图以这种方式解决问题(webapp的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不是obvius,所以我不喜欢这个解决方案。还有其他任何建议吗?

3 个答案:

答案 0 :(得分:8)

我有类似的问题,我找到了解决方案。通过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配置都是相同的。

答案 1 :(得分:1)

您正在尝试使用传输级安全性。如果您尝试使用ws-security保护您的个人服务,则可以在服务受到保护时保持wsdl处于打开状态...

答案 2 :(得分:0)

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