Tomcat6中的基本身份验证无法在目录上运行

时间:2017-06-19 07:08:33

标签: java tomcat authentication web.xml

我在tomcat网站目录中有以下结构

/webapps/ROOT.war
/webapps/ROOT/
/webapps/protect/

在我的ROOT.war java应用程序内的web.xml中,我已经为ROOT应用程序的某些页面配置了基本身份验证,这些页面正常运行。

但我需要将相同的规则应用于目录“protect”,这不是ROOT应用程序的一部分。我将这些规则添加到ROOT应用程序内部的web.xml和/ opt / tomcat / conf /中的web.xml文件中,但仍可访问目录“protect”而无需身份验证。有什么想法吗?

这是适用于ROOT路径的安全配置,但不适用于保护路径:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Some paths need authentication</web-resource-name>
        <url-pattern>/rest/*</url-pattern>
        <url-pattern>/protect/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>authenticatedUser</role-name>
    </auth-constraint>

    <user-data-constraint>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

2 个答案:

答案 0 :(得分:1)

假设保护是另一个Web应用程序,而不是您的Web应用程序的目录 ROOT ,您可以这样做,但如果您打算使用保护< / strong>作为 ROOT 的目录,那么你不能这样做。相反,您必须将该目录移到 ROOT

因此,假设两者都是两个不同但相关的Web应用程序,您问题中的关键点是您希望为两个Web应用程序共享相同的安全配置,并且您希望通过 Web部署执行此操作其中一个的描述符

我担心这是不可能的,因为Web部署描述符web.xml旨在设置其当前Web应用程序的配置或 Context

Tomcat有几个允许您对Web应用程序进行分组的容器。这个容器是:

  • 引擎是收到所有请求的高级容器。它包含几个主机。
  • 主机,是同一虚拟主机内所有Context的容器
  • 上下文,即网络应用程序。

还有一个Cluster容器,但这里不相关。

由于您要共享通用安全配置,您必须至少在主机级别创建 Realm (请参阅What is a Realm),比如,在conf/server.xml全局或您感兴趣的主机内。

这将允许您在主机中共享所有上下文的相同用户和凭据源。然后,您可以单独配置每个上下文

甚至可以在同一主机中的所有上下文之间配置单点登录(请参阅Single Sign On at Host level)。我想这就是你真正想要的。这样,如果两个Web应用程序都只有一个,用户就会感觉到。

然后,从 ROOT 上下文中删除保护网址格式,因为它没有任何意义,并在 protect {{1}内部正确配置}。

希望它有所帮助!

答案 1 :(得分:1)

url-pattern相对于当前webapp的根目录而不是主机应用程序。所以在&#34; protect&#34;的web.xml中您必须将网址格式更改为&#34; / *&#34;。

如果所有网络应用中的web-resource-name相同,则一旦用户输入,浏览器应自动将密码重新发送给所有网络应用。