【问题标题】:tomcat and security-constraint: url pattern not workingtomcat 和安全约束:url 模式不起作用
【发布时间】:2020-11-04 23:47:16
【问题描述】:

我有 2 个应用程序部署到一个 tomcat 服务器。其中一个(app2)我想被tomcat保护。

生成的 URL 示例:

localhost:8080/app1
localhost:8080/app2

自行开发应用程序,因此我无权访问应用程序本身的特定于应用程序的 web.xml。 所以我在tomcat的/conf文件夹中使用“全局”。这是我添加的:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee                       http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">

  <security-constraint>
    <display-name>app2 Users</display-name>
    <web-resource-collection>
      <web-resource-name>app2 Content</web-resource-name>
      <url-pattern>/app2/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>*</role-name>
    </auth-constraint>
  </security-constraint>

  <security-role>
    <role-name>*</role-name>
  </security-role>

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

  <servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>listings</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
      <param-name>fork</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>xpoweredBy</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jspx</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
  <!-- mime type mappings -->
</web-app>

恕我直言,这是保护 app2 所必需的,但我没有收到密码提示,而且 app2 无需基本身份验证即可访问。这是日志:

15-Jul-2020 14:58:35.663 FINE [http-nio-8080-exec-1] org.apache.catalina.authenticator.AuthenticatorBase.invoke Security checking request GET /blabla2/
15-Jul-2020 14:58:35.664 FINE [http-nio-8080-exec-1] org.apache.catalina.realm.RealmBase.findSecurityConstraints   Checking constraint 'SecurityConstraint[blabla Content]' against GET /index.jsp --> false
15-Jul-2020 14:58:35.664 FINE [http-nio-8080-exec-1] org.apache.catalina.realm.RealmBase.findSecurityConstraints   Checking constraint 'SecurityConstraint[blabla Content]' against GET /index.jsp --> false
15-Jul-2020 14:58:35.664 FINE [http-nio-8080-exec-1] org.apache.catalina.realm.RealmBase.findSecurityConstraints   Checking constraint 'SecurityConstraint[blabla Content]' against GET /index.jsp --> false
15-Jul-2020 14:58:35.664 FINE [http-nio-8080-exec-1] org.apache.catalina.realm.RealmBase.findSecurityConstraints   Checking constraint 'SecurityConstraint[blabla Content]' against GET /index.jsp --> false
15-Jul-2020 14:58:35.665 FINE [http-nio-8080-exec-1] org.apache.catalina.realm.RealmBase.findSecurityConstraints   No applicable constraint located

url-pattern 设置为/* 时,一切正常,但(如预期)app1 受到保护。 我的url-pattern 怎么了?

【问题讨论】:

  • 请提供更多配置,因为我们不知道它是否正确。特别是您需要检查您是否在 server.xml 的主机级别正确配置了 app2 的上下文,如此处所述Defining a context
  • 我没有添加明确的上下文。这是必需品吗?我更新了问题中的 web.xml,但它是与 tomcat 一起提供的“默认”web.xml
  • 再次阅读您的评论后:我检查了 server.xml 及其默认值:我刚刚添加了 ldap 领域。主机部分是默认的,没有定义任何上下文。

标签: authentication tomcat web.xml url-pattern


【解决方案1】:

web.xml 仅用于服务器范围的配置。您无法定义仅与一个部署/上下文相关的设置。

由于安全约束在部署级别起作用,因此 url-pattern 等设置与部署 Web 根目录相关。

例子:

    <security-constraint>
        <display-name>Authorized Only</display-name>
        <web-resource-collection>
            <web-resource-name>Authorized Only</web-resource-name>
            <url-pattern>/hello</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>*</role-name>
        </auth-constraint>
    </security-constraint>

会阻止 /app1/hello 和 /app2/hello。

如果您只想为一个部署添加授权,则必须在部署的配置中设置此设置。

有关其他示例,请参阅 https://stackoverflow.com/a/17948661/8087167

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多