Tomcat6 中的基本身份验证不适用于目录

Basic authentication in Tomcat6 not working on directory

我的 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>

假设 protect 是另一个 Web 应用程序而不是您的 Web 应用程序 ROOT 的目录,您可以这样做,但是如果您意思是把protect当成ROOT的目录,那就不行了。相反,您必须将该目录移动到 ROOT.

因此,假设两者是两个不同但相关的 Web 应用程序,您问题的关键点是您希望为两个 Web 应用程序共享相同的安全配置,并且您希望从 网络部署描述符其中之一。

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

的配置

Tomcat 有几个容器,可让您对 Web 应用程序进行分组。这些容器是:

  • Engine,是接收所有请求的高级容器。它包含几个主机。
  • Host,是同一个虚拟主机里面所有Context的容器
  • 上下文,Web 应用程序。

还有Cluster容器,这里不相关

由于您想共享一个通用的安全配置,您必须至少在 Host[ 上创建一个 Realm(参见 What is a Realm) =65=] 级别,也就是说,在全局 conf/server.xml 或您感兴趣的 Host 内部。

这将使您可以为 Host 内的所有 Context 共享相同的用户和凭据源。然后,您可以单独配置每个 Context

甚至可以在同一 Host 内的所有 Context 之间配置单点登录(参见 Single Sign On at Host level)。我认为这就是您真正想要的。这样用户会觉得两个 Web 应用程序都只有一个。

然后,从ROOT上下文中删除protect url模式,因为它没有任何意义,并在里面正确配置它保护 web.xml.

希望对您有所帮助!

url-pattern 是相对于当前 webapp 的根目录而不是主机应用程序的。因此,在 "protect" 的 web.xml 中,您必须将 URL 模式更改为“/*”。

如果所有网络应用的网络资源名称都相同,则浏览器应在用户输入密码后自动将密码重新发送到所有网络应用。