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

Java Tomcat6中的基本身份验证不适用于目录,java,tomcat,authentication,web.xml,Java,Tomcat,Authentication,Web.xml,我的tomcat web目录中有以下结构 /webapps/ROOT.war /webapps/ROOT/ /webapps/protect/ 在我的ROOT.war java应用程序中的web.xml中,我已经为根应用程序的一些页面配置了基本身份验证,这些页面工作正常 但是我需要将相同的规则应用于目录“protect”,它不是根应用程序的一部分。我将这些规则添加到根应用程序内部的web.xml和/opt/tomcat/conf/中的web.xml文件中,但是目录“protect”仍然可以在没

我的tomcat web目录中有以下结构

/webapps/ROOT.war
/webapps/ROOT/
/webapps/protect/
在我的ROOT.war java应用程序中的web.xml中,我已经为根应用程序的一些页面配置了基本身份验证,这些页面工作正常

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

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

<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的目录,则您不能这样做。相反,您必须将该目录移动到根目录中

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

恐怕这是不可能的,因为web部署描述符
web.xml
设计用于设置其当前web应用程序或上下文的配置

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

  • Engine是接收所有请求的高级容器。它包含多个主机
  • 主机,是同一虚拟主机内所有上下文的容器
  • 上下文,web应用程序
还有一个集群容器,但它与此无关

由于要共享公共安全配置,您必须至少在主机级别创建一个领域(请参阅),也就是说,在
conf/server.xml
全局或感兴趣的主机内部

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

甚至可以在同一主机内的所有上下文之间配置单点登录(请参阅)。我想这才是你真正想要的。这样,用户会觉得两个web应用程序只是一个

然后,从根上下文中删除protectURL模式,因为它没有意义,并在protect
web.xml
中正确配置它


希望有帮助

假设protect是另一个web应用程序,而不是您的web应用程序的目录ROOT,您可以这样做,但如果您打算将protect用作ROOT的目录,则您不能这样做。相反,您必须将该目录移动到根目录中

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

恐怕这是不可能的,因为web部署描述符
web.xml
设计用于设置其当前web应用程序或上下文的配置

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

  • Engine是接收所有请求的高级容器。它包含多个主机
  • 主机,是同一虚拟主机内所有上下文的容器
  • 上下文,web应用程序
还有一个集群容器,但它与此无关

由于要共享公共安全配置,您必须至少在主机级别创建一个领域(请参阅),也就是说,在
conf/server.xml
全局或感兴趣的主机内部

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

甚至可以在同一主机内的所有上下文之间配置单点登录(请参阅)。我想这才是你真正想要的。这样,用户会觉得两个web应用程序只是一个

然后,从根上下文中删除protectURL模式,因为它没有意义,并在protect
web.xml
中正确配置它


希望有帮助

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


如果所有web应用程序的web资源名称相同,浏览器应在用户输入密码后自动将密码重新发送给所有web应用程序。

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


如果所有web应用程序中的web资源名称相同,浏览器应在用户输入密码后自动将密码重新发送给所有web应用程序。

您可以尝试使用符号链接保护其免受ROOT用户的攻击吗?@mikep谢谢您的提示,有关如何使用符号链接的更多信息?没有这方面的经验…保护Web应用程序吗?如果是这样,您可以在protect的web.xml中执行与ROOT相同的操作。否则,您可以在ROOT下移动protect,ROOT的web.xml将起作用(类似于symlink)。您可以尝试使用symlink保护ROOT吗?@mikep谢谢您的提示,有关如何使用symlink的更多信息?没有这方面的经验…保护Web应用程序吗?如果是这样,您可以在protect的web.xml中执行与ROOT相同的操作。否则,你可以