【问题标题】:Precedence of security-constraint over filters in ServletsServlet 中的安全约束优先于过滤器
【发布时间】:2013-07-15 12:14:23
【问题描述】:

在研究 servlet 中的安全约束和过滤器时,我在 web.xml 文件中做了以下声明,但没有按预期工作:

<security-constraint>
    <web-resource-collection>
      <web-resource-name>BeerSelector</web-resource-name>
        <url-pattern>/SelectBeer.do</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
      </web-resource-collection>
     <auth-constraint>
        <role-name>Admin</role-name>
     </auth-constraint>
 </security-constraint>


  <filter>
   <filter-name>LoginFilter</filter-name>
   <filter-class>model.MyFilter</filter-class>
  </filter>


  <filter-mapping>
  <filter-name>LoginFilter</filter-name>
  <url-pattern>/SelectBeer.do</url-pattern>
  </filter-mapping>

根据我的阅读:过滤器应该在请求到达某个url之前遇到,那么,为什么首先调用security-constraint?

我知道从安全角度来看这是有道理的(要到达您必须经过身份验证的过滤器),但我想知道请求触发的序列

容器是否首先搜索受保护的资源,从而触发安全约束?

但这将与下面从 Head First Servlets 和 Jsp 中引用的段落相矛盾“

请记住,在 DD 中, 发生在请求之后。换句话说,客户已经做出 Container 开始查看时的请求 元素来决定如何响应。请求 数据已经通过网络发送了

或者请求可能同时触发:过滤器和安全约束,但安全约束优于过滤器?

【问题讨论】:

    标签: java servlets servlet-filters security-constraint


    【解决方案1】:

    容器首先处理安全约束。

    简而言之,Servlet 容器首先检查传入的 URL 并检查它是否匹配所谓的 excludedunchecked 约束。排除表示任何人都无法访问该 URL,而未选中表示相反,允许任何人访问该 URL。

    在这个阶段,如果您安装了所谓的 JACC 提供程序,容器可以调用您自己的代码。

    在此之后,容器可能会尝试对当前用户进行身份验证,从而可以再次调用您自己的代码。如果您注册了 SAM (ServerAuthModule),如果您没有注册 SAM,或者您正在使用非完整的 Java EE 实现(例如,Java EE Web 配置文件服务器,如TomEE 或像 Tomcat 这样的裸 Servlet 容器) 它取决于服务器是否总是调用某种特定于服务器的登录模块(罕见)或仅在未授予未经身份验证的用户访问权限时调用(典型)。 p>

    SAM 是一个类似于过滤器的东西,因为它可以重定向、转发和包装请求和响应,但它不是 HTTP Servlet 过滤器。

    身份验证成功后,您的 JACC 策略将被再次调用,或者当您尚未安装一个时,容器将使用专有机制查看您现在是否可以通过身份验证访问。

    如果确实确定你有访问权限,就会调用所谓的“资源”,也就是说容器会调用过滤链中的第一个Filter,最终会调用到被请求的目标Servlet URL 已映射。

    您可以在此处阅读有关 SAM 的更多信息:http://arjan-tijms.omnifaces.org/2012/11/implementing-container-authentication.html

    更多关于 JACC 供应商的信息在这里:http://arjan-tijms.omnifaces.org/2014/03/implementing-container-authorization-in.html

    【讨论】:

      【解决方案2】:

      过滤器执行进入请求的“服务”端。安全约束在此之前运行。它们帮助服务器决定是否提供 url。您可以将过滤器角色视为“在 servlet 执行之前/之后”执行的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-10
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 2020-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多