Spring security:在 3.1 中,仅针对“GET”请求绕过安全过滤器

Posted

技术标签:

【中文标题】Spring security:在 3.1 中,仅针对“GET”请求绕过安全过滤器【英文标题】:Spring security: In 3.1, bypass security filter for only 'GET' requests 【发布时间】:2014-01-31 02:16:11 【问题描述】:

我希望我的服务仅对传入的 POST/PUT/DELETE 请求执行身份验证,并为任何 GET 请求绕过它。低于 3.1 的 Spring 版本具有“filters=”none””属性,可用于绕过特定 URL 模式的所有安全过滤器。在 3.1 中,不推荐使用“filters=”none”,替代解决方案是为“http”元素使用“security=”none”属性。这不支持基于传入请求类型(GET/PUT/POST/DELETE)的配置。

我使用的是 Spring 3.1.1,当前配置如下:

<!-- Just un-comment any resource if you don't want authentication to be done on them -->
<http pattern="/base/version" security="none"/>

<!-- Secure resources -->
<http create-session='stateless' entry-point-ref="tokenAuthenticationEntryPoint">
  <custom-filter position="PRE_AUTH_FILTER" ref="tokenAuthenticationFilter" />
  <intercept-url pattern="/v1/abc/**" method="GET" filters="none"/>  //This doesn’t work currently
  <intercept-url pattern="/v1/abc/**" method="POST" access="ROLE_USER"/>
  <intercept-url pattern="/v1/abc/**" method="PUT" access="ROLE_USER"/>
  <intercept-url pattern="/v1/abc/**" method="DELETE" access="ROLE_USER"/>
  <intercept-url pattern="/**" access="ROLE_USER" />
</http>

如何绕过 Spring 3.1 中 pattern="/v1/abc/**" method="GET" 的安全过滤器?

【问题讨论】:

【参考方案1】:

我找到了解决问题的方法 - 使用基于表达式的访问控制,我使用了 access="permitAll" 来配置授权而不禁用过滤器。

<!-- Just un-comment any resource if you don't want authentication to be done on them -->
<http pattern="/base/version" security="none"/>

<!-- Secure resources -->
<http create-session='stateless' entry-point-ref="tokenAuthenticationEntryPoint" use-    expressions="true">
  <custom-filter position="PRE_AUTH_FILTER" ref="tokenAuthenticationFilter" />
  <intercept-url pattern="/v1/abc/**" method="GET" access="permitAll"/>
  <intercept-url pattern="/v1/abc/**" method="POST" access="hasRole('ROLE_USER')"/>
  <intercept-url pattern="/v1/abc/**" method="PUT" access="hasRole('ROLE_USER')"/>
  <intercept-url pattern="/v1/abc/**" method="DELETE" access="hasRole('ROLE_USER')"/>
  <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</http>

【讨论】:

以上是关于Spring security:在 3.1 中,仅针对“GET”请求绕过安全过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Security 3.1 中进行没有身份验证和授权的并发会话控制

在 Spring Security 3.1 中,StandardPasswordEncoder 对密码进行盐渍化最合适的用途是啥?

spring security 3.1 实现权限控制

Spring Security 3.1 中功能强大的加密工具 PasswordEncoder

如何在 Spring Security 3.1 中使用 acl_entry 表中的掩码字段?

Spring Security 3.1 + JPA - 空指针异常