У меня есть веб-приложение с весной безопасности, и по умолчанию для всех страниц требуется авторизация. В моем сценарии администратор может в какой-то момент решить отключить защиту для некоторых страниц или полностью отключить ее. Как это можно было бы достичь лучше всего? Я думал об изменении FilterChainProxy
, но мне непонятно, как именно (getFilterChains()
возвращает неизменяемый список)?Отключить Spring Security программно
ответ
Подкласс DelgatingFilterProxy
и проверить флаг ли для вызова делегата или нет.
Затем используйте это в своем web.xml вместо DelegatingFilterProxy
, который используется для springSecurityFilterChain
(при условии, что вы используете конфигурацию пространства имен). Например:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>com.foo.spring.MyDelegatingFilterProxy</filter-class>
</filter>
В вашем DelegatingFilterProxy проверить флаг (например, свойство системы), чтобы увидеть, если вы должны делегировать или нет.
class MyDelegatingFilterProxy extends DelegatingFilterProxy {
override def doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) {
if (System.getProperty("skipSpringSecurity" != null) {
// Ignore the DelegatingProxyFilter delegate
chain.doFilter(request, response)
} else {
// Call the delegate
super.doFilter(request, response, chain)
}
}
}
Вы можете использовать ту же технику, чтобы использовать одеяло подстановочные как <security:intercept-url pattern="/**" access="ROLE_USER" />
, а затем пропустить вызов фильтра Spring Security для некоторого множества путей при/(для статических файлов и т.д.).
Большое спасибо, это то, что я искал, и он отлично работает! – kpentchev
Как настроена конфигурация Spring? Вы можете добавить пользовательский разрешительный документ, который проверяет ваши условия?
Посмотрите spring-security writing a custom PermissionEvaluator - how to inject a DAO service?
У меня есть некоторые конкретные избиратели и AuthenticationProvider, но в противном случае он использует по умолчанию веб-приложения конфигурации '<безопасности на: HTTP автоматической конфигурации =«истинный» \t \t аутентификации менеджер-исх =«AuthenticationManager» \t \t доступа-решение-менеджера -REF = "repositoryAccessDecisionManager" \t \t AccessDenied-страница = "/ AccessDenied"> \t \t \t \t <безопасность: перехватывать-шаблон URL = "/ **" доступ = "ROLE_USER" /> \t \t < безопасность: http-basic /> \t security: ht tp> ' – kpentchev
Для начала ваша конфигурация кажется необычной, поскольку * все * кажется защищенным, включая страницу входа (что обычно не так). Не могли бы вы подробнее рассказать о сценарии, в котором администратор может отключить безопасность страницы? Кажется необычным и интересным одновременно. –
Ну, он использует http-basic, поэтому используется диалоговое окно проверки подлинности браузера по умолчанию. Приложение является своего рода db search/explorer/server, и поскольку все защищено по умолчанию, администратору может потребоваться/решить его разоблачить (например, из-за сторонних приложений, которые должны общаться с приложением, но не поддерживают аутентификацию) , – kpentchev