7

在研究 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之前遇到,那么,为什么首先调用安全约束?

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

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

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

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

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

4

2 回答 2

4

容器首先处理安全约束。

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

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

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

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

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

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

您可以在此处阅读有关 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

于 2014-10-07T20:59:36.753 回答
0

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

于 2014-10-07T20:02:57.980 回答