我正在使用带有两个过滤器的 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 是标准弹簧安全过滤器,配置为:
<beans:bean id="x509PrincipalExtractor" class="org.springframework.security.web.authentication.preauth.x509.SubjectDnX509PrincipalExtractor">
<beans:property name="subjectDnRegex" value="CN=(.*?),"/>
</beans:bean>
如果需要,我可以提供经过清理的 customHeaderFilter,但此时控件永远不会到达过滤器,因此对于其中发生的事情无关紧要。
任何帮助/指导将不胜感激。