在javax.faces.webapp.FacesServlet
文档中提到,
允许的 HTTP 方法
JSF 规范只需要使用 GET 和 POST http 方法。如果您的 Web 应用程序不需要任何其他 http 方法,例如 PUT 和 DELETE,请考虑限制 允许的 HTTP 方法使用
<http-method>
和<http-method-omission>
元素。请参阅Java的安全性 Servlet 规范以获取有关使用这些元素的更多信息。
我的应用程序确实不依赖于其他HTTP方法(GET
和POST
除外(。因此,我尝试使用<http-method>
(或<http-method-omission>
(来排除除GET
和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/*
,除 发现了以下方法:开机自检、获取警告:JACC:对于 URL 模式
/admin_side/*
,除 发现了以下方法:开机自检、获取
什么意思?
此外,<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 引用的资源 pattern/test.jsp,当由除 GET 之外的所有 http 方法访问时, 应限制为仅由经过身份验证的用户查看 请注意,安全约束 不适用于 http 方法 GET,而仅适用于其他方法 方法(发布,头,放置等(。
我发现强文本的最后一句话令人困惑。这是否意味着使用GET
请求,匿名用户也可以访问给定 url 模式中列出的资源,因为这意味着">安全约束不适用于 http 方法 GET"?
什么意思?
这意味着除了GET和POST之外的所有方法都被揭开了,意味着不受保护。每个人都可以使用 PUT 和 HEAD 等方法访问 url 模式/user_side/*
而无需身份验证。
要保护其他方法,请添加以下内容:
<security-constraint>
<web-resource-collection>
<web-resource-name>protected</web-resource-name>
<url-pattern>/user_side/*</url-pattern>
<http-method-omission>GET</http-method-omission>
<http-method-omission>POST</http-method-omission>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
如果您使用的是 Servlet 3.1,您还可以使用较短的标记:
<deny-uncovered-http-methods/>
同样,不是在所有元素中都这样做,而是可以 这需要全局配置,以便可以应用于所有资源 在应用程序中,并且除了 GET 和 POST HTTP 请求之外的所有请求都可以 被省略,即全局应用于应用程序 - 也许通过使用 更通用的 url 模式,如/*?
是的,这是可能的。您可以使用 url 模式/
来包含所有子文件夹。
我发现强文本的最后一句话令人困惑。这是否意味着 使用 GET 请求,给定 url 模式中列出的资源可以 也可以由匿名用户访问,因为它意味着说"的 安全约束不适用于 http 方法 GET"?
你是对的,这意味着匿名用户可以使用GET方法访问给定的url模式。所有其他方法都受到保护。
另请参阅:
- Web 中的安全约束 URL 模式和 * 字符.xml
- 排除 Web 中的 css 和图像资源.xml安全约束