【问题标题】:Authenticate WSDL url or disable it from exposed验证 WSDL url 或禁用它以防止暴露
【发布时间】:2017-10-04 05:19:22
【问题描述】:

我需要隐藏 WSDL url 或仅将其提供给经过身份验证的用户。即我不想暴露http://localhost:8080/services/Application?wsdl

Tomcat 版本 8.5.11、java 8、Axis 1.4(我知道 Axis 版本太旧,但这是我现在必须使用的)

我想我可以向 web.xml 添加一个安全约束,如http://docs.oracle.com/cd/E19798-01/821-1841/bncbk/index.html 中所述,如下所示:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>WSDL</web-resource-name>
        <description>WSDL Files</description>
        <url-pattern>*?wsdl</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

还发现这个帖子建议做同样的事情但对我不起作用Hiding WSDL in JAX-WS

Tomcat 抛出以下错误:

org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3782)
    at org.apache.catalina.startup.HostConfig.reload(HostConfig.java:1377)
    at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1350)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1586)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:280)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1164)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1388)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1392)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1360)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> *?wsdl in security constraint
    at org.apache.catalina.core.StandardContext.addConstraint(StandardContext.java:2827)
    at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1317)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1190)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:775)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5087)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 11 more

知道我做错了什么吗?或者我如何才能实现上述目标?

在此先感谢

【问题讨论】:

  • 这是一个错误的模式&lt;url-pattern&gt;*?wsdl&lt;/url-pattern&gt;,改用这个&lt;url-pattern&gt;*.wsdl&lt;/url-pattern&gt;,你的异常就会消失。
  • 查看here 了解有效的 URL 模式。
  • 我同意 *.wsdl 将摆脱异常,但它不会解决问题。我在 URL 的末尾有 ?wsdl 而不是 .wsdl。

标签: java web-services tomcat wsdl axis


【解决方案1】:

据我所知,Axis 1.4 不符合 JAVA WS 规范。我相信 Axis 1.4 早于 JAVA WS 规范。

我相信可以编写一个 servlet 来过滤 WSDL 文件。 https://coderanch.com/t/224470/java/Disable-wsdl-url-Axis#1054987

【讨论】:

    【解决方案2】:

    感谢所有试图提供帮助的人,在长时间阅读 AXIS 文档之后,似乎有两种方法可以禁用 wsdl 的暴露:

    1- 默认情况下,Axis 提供三个 Axis servlet 查询字符串处理程序(?list、?method 和 ?wsdl),如果您关闭默认行为,则不会发布 wsdl,您可以通过设置将useDefaultQueryStrings 标记为false,如下在server-config.wsdd 文件中的http transport 上:

      <transport name="http">
            <requestFlow>
                <handler type="URLMapper"/>
                <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
            </requestFlow>
            <parameter name="useDefaultQueryStrings" value="false" />
        </transport>
    

    2- 在文档中有一个名为 (Pre-Configured Axis Components Reference) 的部分,这里有一个 URLMapper 具有以下描述:

    "The URLMapper, an HTTP-specific handler, usually goes on HTTP transport chains (it is deployed by default). It serves to do service dispatch based on URL - for instance, this is the Handler which allows URLs like http://localhost:8080/axis/services/MyService?wsdl to work."
    

    如果您再次注释掉 URLMapper,则不会发布 wsdl。您需要注释掉处理程序

    <!--    <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>-->
    

    以及requestFlow中的引用:

    <transport name="http">
        <requestFlow>
            <!--<handler type="URLMapper"/>-->
            <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
        </requestFlow>
    </transport>
    

    应该是这样的。

    此处为 AXIS 文档http://axis.apache.org/axis/java/reference.html

    我个人选择了第一个解决方案,如果有人认为我们不应该这样做,我将不胜感激,请随时发表评论。

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 2019-03-21
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      相关资源
      最近更新 更多