在javax.faces.webapp.FacesServlet
文档中,提到了,
允许的 HTTP 方法
JSF 规范只要求使用 GET 和 POST http 方法。如果您的 Web 应用程序不需要任何其他 http 方法,例如 PUT 和 DELETE,请考虑使用
<http-method>
和<http-method-omission>
元素限制允许的 http 方法。有关使用这些元素的更多信息,请参阅 Java Servlet 规范的安全性。
我的应用程序确实不依赖于其他 HTTP 方法(除了GET
和POST
)。因此,我试图使用<http-method>
(or <http-method-omission>
) 来排除除GET
and之外的所有方法POST
。
在 web.xml 中,JAAS Servlet 安全约束配置如下。
<security-constraint>
<display-name>AdminConstraint</display-name>
<web-resource-collection>
<web-resource-name>ROLE_ADMIN</web-resource-name>
<description/>
<url-pattern>/admin_side/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>ROLE_ADMIN</role-name>
</auth-constraint>
<user-data-constraint>
<description/>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<security-constraint>
<display-name>UserConstraint</display-name>
<web-resource-collection>
<web-resource-name>ROLE_USER</web-resource-name>
<description/>
<url-pattern>/user_side/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>ROLE_USER</role-name>
</auth-constraint>
<user-data-constraint>
<description/>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
使用这些元素,
<http-method>GET</http-method>
<http-method>POST</http-method>
我希望所有其他 HTTP 方法都被禁止。
但是,GlassFish Server 4.1 在服务器终端上记录以下警告。
警告:JACC:对于 URL 模式
/user_side/*
,除了以下方法之外的所有方法都被发现:POST、GET警告:JACC:对于 URL 模式
/admin_side/*
,除了以下方法之外的所有方法都被发现:POST、GET
这是什么意思?
另外,不是在所有<security-constraint>
元素中都这样做,而是可以全局配置,以便它可以应用于应用程序中的所有资源,并且可以省略所有除了GET
和POST
HTTP 请求,即全局应用于应用程序 - 也许通过使用更通用的专用url 模式之类的/*
?
这里有一个例子。
<security-constraint> <display-name>WebConstraint</display-name> <web-resource-collection> <web-resource-name>test</web-resource-name> <description/> <url-pattern>/test.jsp</url-pattern> <http-method>POST</http-method> <http-method>HEAD</http-method> <http-method>PUT</http-method> <http-method>OPTIONS</http-method> <http-method>TRACE</http-method> <http-method>DELETE</http-method> </web-resource-collection> <auth-constraint> <description/> <role-name>dev</role-name> </auth-constraint> </security-constraint>
上面的元素表明由 url 模式 /test.jsp 引用的资源,当被除 GET 之外的所有 http 方法访问时,应该被限制为只能由属于角色 dev 的经过身份验证的用户查看。请注意,安全约束不适用于 http 方法 GET,而仅适用于其他方法(POST、HEAD、PUT 等)。
我发现强文本中的最后一句话令人困惑。这是否意味着使用GET
请求,给定 url-pattern 中列出的资源也可以被匿名用户访问,因为这意味着“安全约束不适用于 http-method GET ”?