Spring-security 中的 FilterInvocationSecurityMetadataSourceParser 类(在源代码中尝试在 STS 中使用 Ctrl/Cmd+Shift+T)解析拦截 url 标签并创建 ExpressionBasedFilterInvocationSecurityMetadataSource 的实例,该实例扩展了 DefaultFilterInvocationSecurityMetadataSource,该 DefaultFilterInvocationSecurityMetadataSource 实现了扩展 SecurityMetadataSource 的 FilterInvocationSecurityMetadataSource。
我所做的是创建一个实现 FilterInvocationSecurityMetadataSource, OptionsFromDataBaseFilterInvocationSecurityMetadataSource的自定义类。我使用 DefaultFilterInvocationSecurityMetadataSource 作为使用 urlMatcher 的基础,来实现 support() 方法和类似的东西。
然后你必须实现这些方法:
小心后者,因为它是在启动时调用的,并且此时可能没有很好地配置(我的意思是,自动装配数据源或持久性上下文,具体取决于您使用的是什么)。web环境下的解决方案是在web.xml中配置contextConfigLocation,在applicationContext-security.xml之前加载applicationContext.xml
最后一步是自定义 applicationContext-security.xml 来加载这个 bean。
为此,我在此文件中使用了常规 bean,而不是安全命名空间:
<beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
<filter-chain-map path-type="ant">
<filter-chain pattern="/images/*" filters="none" />
<filter-chain pattern="/resources/**" filters="none" />
<filter-chain pattern="/**" filters="
securityContextPersistenceFilter,
logoutFilter,
basicAuthenticationFilter,
exceptionTranslationFilter,
filterSecurityInterceptor"
/>
</filter-chain-map>
</beans:bean>
您必须定义所有相关的 bean。例如:
<beans:bean id="filterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<beans:property name="authenticationManager" ref="authenticationManager"></beans:property>
<beans:property name="accessDecisionManager" ref="affirmativeBased"></beans:property>
<beans:property name="securityMetadataSource" ref="optionsFromDataBaseFilterInvocationSecurityMetadataSource"></beans:property>
<beans:property name="validateConfigAttributes" value="true"/></beans:bean>
我知道这不是一个很好解释的答案,但它并不像看起来那么难。
只需使用弹簧源作为基础,您将获得您想要的。
使用数据库中的数据进行调试会对您有很大帮助。