2012-03-21 4 views
2

У меня есть веб-приложение с весной безопасности, и по умолчанию для всех страниц требуется авторизация. В моем сценарии администратор может в какой-то момент решить отключить защиту для некоторых страниц или полностью отключить ее. Как это можно было бы достичь лучше всего? Я думал об изменении FilterChainProxy, но мне непонятно, как именно (getFilterChains() возвращает неизменяемый список)?Отключить Spring Security программно

+0

Для начала ваша конфигурация кажется необычной, поскольку * все * кажется защищенным, включая страницу входа (что обычно не так). Не могли бы вы подробнее рассказать о сценарии, в котором администратор может отключить безопасность страницы? Кажется необычным и интересным одновременно. –

+0

Ну, он использует http-basic, поэтому используется диалоговое окно проверки подлинности браузера по умолчанию. Приложение является своего рода db search/explorer/server, и поскольку все защищено по умолчанию, администратору может потребоваться/решить его разоблачить (например, из-за сторонних приложений, которые должны общаться с приложением, но не поддерживают аутентификацию) , – kpentchev

ответ

3

Подкласс 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 для некоторого множества путей при/(для статических файлов и т.д.).

+0

Большое спасибо, это то, что я искал, и он отлично работает! – kpentchev

0

Как настроена конфигурация Spring? Вы можете добавить пользовательский разрешительный документ, который проверяет ваши условия?

Посмотрите spring-security writing a custom PermissionEvaluator - how to inject a DAO service?

+0

У меня есть некоторые конкретные избиратели и 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 ' – kpentchev