如何有条件地跳过Grails Spring Security插件过滤器链中的SecurityContextPersistenceFilter过滤器

Sco*_*ott 6 grails spring-security grails-plugin

我有一个独特的场景,我试图在Spring Security插件的限制下解决(版本1.2.7.3,如果很奇怪).我创建了一个自定义SSO插件,允许使用签名URL登录.自定义插件工作得很好,我根据文档添加了在resources.groovy中创建bean并添加到BootStrap.groovy中的过滤器链中.

SpringSecurityUtils.clientRegisterFilter('ssoFilter', SecurityFilterPosition.SECURITY_CONTEXT_FILTER.order + 10)
Run Code Online (Sandbox Code Playgroud)

一旦用户登录,一切运行良好,并且添加到安全上下文的现有活动会话将对用户进行身份验证.

我有一个用例,在这个用例中,已经过身份验证的用户可能会在SSO请求中使用不同的用户返回到同一浏览器(即同一会话cookie).我想让过滤器链注意到URL的查询字符串中的'sso = true'.

我现在看到的行为是从未到达SSO,因为原始用户已经被安全上下文认证.我无法在SecurityContextPersistenceFilter之前添加SSO过滤器,因为这会导致SSO过滤器不断被命中并且实际上没有呈现任何内容的问题.这遵循文档,我已经看到它说你不应该在安全上下文过滤器之前放置任何过滤器.

我已经考虑使用springsecurity.filterChain.chainMap配置说明,专门为具有'sso = true'的URL创建一个特殊的过滤器链(我在未经身份验证的流程中通过向DelegatingAuthenticationEntryPoint添加自定义RequestMatcherAuthenticationEntryPoint实现).但是,从文档和实验中可以看出,只过滤了路径.

有没有办法确保在URL上看到'sso = true'时,SSO过滤器在仍具有安全上下文可用性的情况下被命中,或者SecurityContextPersistenceFilter可以将请求传递给SSO过滤器?

Dan*_*ien 5

在我看来,你可以使用自定义SecurityContextRepository.

Spring Security Grails插件的1.2.7.3版本似乎使用了Spring Security 3.0.7.如Spring Security参考文献的第8.3.1节所述,从Spring Security 3.0开始,SecurityContextPersistenceFilter配置了一个SecurityContextRepositorybean,负责加载和保存SecurityContext.默认情况下,这是一个实例HttpSessionSecurityContextRepository.

您可以创建一个扩展的自定义类HttpSessionSecurityContextRepository.如果请求包含sso=true查询参数,则自定义子类可以覆盖loadContext(HttpRequestResponseHolder)方法以删除"SPRING_SECURITY_CONTEXT"会话属性.

您可以HttpSessionSecurityContextRepository在GitHub上查看Spring Security 3.0.7中的实现:https:
//github.com/spring-projects/spring-security/blob/3.0.7.RELEASE/web/src/main/java/org/springframework /security/web/context/HttpSessionSecurityContextRepository.java

相关:如何在没有会话的情况下使用Spring Security?