在彈簧安全的FilterInvocationSecurityMetadataSourceParser類(嘗試按Ctrl /爲Cmd + Shift + T與源代碼STS)解析截距-URL標籤並創建ExpressionBasedFilterInvocationSecurityMetadataSource的實例,其延伸DefaultFilterInvocationSecurityMetadataSource實現FilterInvocationSecurityMetadataSource延伸SecurityMetadataSource。
我所做的是創建一個自定義類,它實現FilterInvocationSecurityMetadataSource,OptionsFromDataBaseFilterInvocationSecurityMetadataSource。我使用DefaultFilterInvocationSecurityMetadataSource作爲基礎來使用urlMatcher,來實現support()方法和類似的東西。
然後您必須實現這些方法:
要小心後面的,因爲它在啓動時調用,可能在這個時候配置不好(我的意思是,數據源或持久化上下文自動裝配,取決於你使用的是什麼)。 Web環境中的解決方案是在web.xml中配置contextConfigLocation以在applicationContext-security.xml之前加載applicationContext.xml
最後一步是定製applicationContext-security.xml以加載此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>
你必須定義所有相關的豆類。例如:
<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>
我知道這不是一個很好解釋的答案,但它並不像看起來那麼困難。
只要使用彈簧源作爲基礎,你將獲得你想要的。
使用數據庫中的數據進行調試將對您有所幫助。
它可能會有所幫助:HTTPS://github.com/srinivas1918/spring-security-dynamic -authorization-and-authentication –