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 模式更改为“/*”。
如果所有网络应用的网络资源名称都相同,则浏览器应在用户输入密码后自动将密码重新发送到所有网络应用。
我的 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 模式更改为“/*”。
如果所有网络应用的网络资源名称都相同,则浏览器应在用户输入密码后自动将密码重新发送到所有网络应用。