我使用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但在这一点上控制永远不会到达过滤器,因此它对于发生的事情是无关紧要的。
任何帮助/指导将不胜感激。
为什么你不使用[X509](http://static.springsource.org/spring-security/site/docs/3.2.x/reference/springsecurity-single.html#d0e8028)标签基于接通证书认证? – 2013-03-18 16:57:45
我不记得确切,但我在订购过滤器时遇到了问题,并能够在使用x509和我的自定义过滤器时处理异常。同样的原因,导致我添加自定义'后'位置。即使我这样做了,但是在这种情况下会有所作为吗? – MickJ 2013-03-18 17:14:29
我不确定这可以解决这种情况。对我来说看起来很奇怪的是你的过滤器的位置。从官方文档看,preauth过滤器的正确位置是PRE_AUTH_FILTER(和x509的X509_FILTER)。你有没有尝试在X509_FILTER位置注入x509并在PRE_AUTH_FILTER上自定义一个? – 2013-03-18 17:52:35