Spring-security 中的 FilterInvocationSecurityMetadataSourceParser 类(使用源代码在 STS 中尝试 Ctrl/Cmd+Shift+T)解析拦截 url 标签并创建 ExpressionBasedFilterInvocationSecurityMetadataSource 的实例,该实例扩展 DefaultFilterInvocationSecurityMetadataSource 实现 FilterInvocationSecurityMetadataSource 扩展 SecurityMetadataSource。
我所做的是创建一个自定义类来实现 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>
我知道这不是一个很好解释的答案,但它并不像看起来那么难。
只需使用弹簧源作为基础,你就会得到你想要的。
使用数据库中的数据进行调试,对您有很大帮助。