2013-03-18 124 views
0

我使用Spring安全有两个过滤器: - 为客户端证书X.509认证一个过滤器。他所有的过滤器都是从证书中提取用户名的原则。 - 一个过滤器来执行基于头的身份验证。标题应该有用户名和角色。在这个过滤器中,我检查以确保安全上下文中已经存在一个主体。如果存在,我确保它匹配标题中的内容。然后我从头文件中提取角色并设置授予的权限。 我有一个url模式,我想让角色可以访问 - 'ROLE_USER'春季安全与多个自定义过滤器和角色

现在是问题所在。该请求仅碰到第一个过滤器(X.509),显然该头部中缺少该角色,并且访问被spring安全性拒绝。

我不能切换过滤器的顺序,因为如果我这样做,然后由弹簧提供X.509过滤器看到的都只是本金已经存在,所以没有任何使其失去作用。

有没有办法对被推迟的角色检查,直至所有的过滤器进行处理?或者以其他任何方式来实现我正在尝试做的事情。

这里是我的春天的安全配置:

<security:http auto-config="true" entry-point-ref="customEntryPoint"> 
    <security:intercept-url pattern="/user/**" access="ROLE_USER"/> 
    <security:custom-filter after="EXCEPTION_TRANSLATION_FILTER" ref="x509Filter" /> 
    <security:custom-filter after="FILTER_SECURITY_INTERCEPTOR" ref="headerFilter"/> 
</security:http>  

其中x509Filter是标准的Spring Security过滤器配置为:

<beans:bean id="x509PrincipalExtractor" class="org.springframework.security.web.authentication.preauth.x509.SubjectDnX509PrincipalExtractor"> 
    <beans:property name="subjectDnRegex" value="CN=(.*?),"/> 
</beans:bean> 

我可以提供,如果需要擦洗了customHeaderFilter但在这一点上控制永远不会到达过滤器,因此它对于发生的事情是无关紧要的。

任何帮助/指导将不胜感激。

+0

为什么你不使用[X509](http://static.springsource.org/spring-security/site/docs/3.2.x/reference/springsecurity-single.html#d0e8028)标签基于接通证书认证? – 2013-03-18 16:57:45

+0

我不记得确切,但我在订购过滤器时遇到了问题,并能够在使用x509和我的自定义过滤器时处理异常。同样的原因,导致我添加自定义'后'位置。即使我这样做了,但是在这种情况下会有所作为吗? – MickJ 2013-03-18 17:14:29

+1

我不确定这可以解决这种情况。对我来说看起来很奇怪的是你的过滤器的位置。从官方文档看,preauth过滤器的正确位置是PRE_AUTH_FILTER(和x509的X509_FILTER)。你有没有尝试在X509_FILTER位置注入x509并在PRE_AUTH_FILTER上自定义一个? – 2013-03-18 17:52:35

回答

1

感谢来自@Maksym指针,这个问题是通过改变“后”解析为“前”在customHeaderFilter如下:

<security:custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="headerFilter"/> 

FilterSecurityInterceptor负责处理HTTP资源的安全性,包括应用角色检查。在我的情况下,X509Filter会触发设置主体,但不会设置任何权限。这会导致拦截器拒绝对资源的访问,而headerFilter甚至不会出现在图片中。

通过headerFilter的位置设置到拦截器允许的安全上下文的本金和验证对象之前,必须正确设置与给定的当局,导致预期的行为。