Класс FilterInvocationSecurityMetadataSourceParser в Spring-security (попробуйте Ctrl / Cmd + Shift + T в STS с исходным кодом) анализирует теги intercept-url и создает экземпляры ExpressionBasedFilterInvocationSecurityMetadataSource, которые расширяют класс фильтрации по умолчаниюFreeSataSecataSecuritySec. *
Я создал собственный класс, который реализует FilterInvocationSecurityMetadataSource, OptionsFromDataBaseFilterInvocationSecurityMetadataSource . Я использовал DefaultFilterInvocationSecurityMetadataSource в качестве базы для использования urlMatcher, для реализации метода support () и чего-то в этом роде.
Затем необходимо реализовать следующие методы:
Коллекция getAttributes (объектный объект), где вы можете получить доступ к базе данных, выполняя поиск защищаемого «объекта» (обычно это URL-адрес для доступа), чтобы получить разрешенные атрибуты ConfigAttribute (обычно это ROLE)
булевы опоры (класс clazz)
Коллекция getAllConfigAttributes ()
Будьте осторожны с последним, потому что он вызывается при запуске и, возможно, не очень хорошо настроен в настоящее время (я имею в виду, что источники данных или контекст постоянства автоматически подключаются, в зависимости от того, что вы используете). Решение в веб-среде заключается в настройке contextConfigLocation в web.xml для загрузки applicationContext.xml перед applicationContext-security.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>
Я знаю, что это не очень хорошо объясненный ответ, но это не так сложно, как кажется.
Просто используйте источник пружины в качестве основы, и вы получите то, что вы хотите.
Отладка с данными в вашей базе данных, вам очень поможет.