Spring Security: Как заставить HTTPS с флагом? - PullRequest
6 голосов
/ 22 июня 2011

С помощью Spring Security я настраиваю части моего веб-приложения, которые должны быть защищены с помощью https, с тегом security:intercept-url.

Например:

<security:intercept-url pattern="/**/*secure*" requires-channel="https"/>
<security:intercept-url pattern="/**" requires-channel="http" />    

Таким образом, все запросы с«secure» в имени файла или каталогах, содержащих «secure» на самом низком уровне, получают https, остальные получат http.

Есть ли способ использовать флаг, чтобы заставить Spring принудительно установить https?Я не мог заставить что-либо работать, что берет вещи после "?"URL.

  • http://domain/abc?secure=true => https
  • http://domain/abc => http

Затем Spring будет перенаправлять прозрачно каждый запрос, идущий на http://domain/abc?secure=truehttps://domain/abc?secure=true.

Есть ли способ достичь этого?Первый шаблон в примере достигает результата для «защищенного», возникающего до «?», Но я ищу решение / шаблон, чтобы иметь флаг после «?»только.

Ответы [ 2 ]

3 голосов
/ 27 июня 2011

Чтобы Spring считал фрагменты после "?" в urls для stripQueryStringFromUrls должно быть установлено значение false.

Вот решение, которое я нашел на форуме Spring : Когда этот BeanPostProcessor загружен, свойство будет установлено.

public class BeanPostProcessorImpl implements BeanPostProcessor
{
    final static private Logger log = Logger.getLogger(BeanPostProcessorImpl.class);

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
    {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
    {
        if (bean instanceof DefaultFilterInvocationSecurityMetadataSource)
        {
            log.info("********* Post-processing " + beanName);
            ((DefaultFilterInvocationSecurityMetadataSource) bean).setStripQueryStringFromUrls(false);
        }
        return bean;
    }
}

Таким образом, шаблон

<security:intercept-url pattern="/**/*?secure=true*" requires-channel="https"/>

наконец-то работает.

2 голосов
/ 27 июня 2011

Насколько я могу сказать, вы хотите, чтобы у вас был URL-параметр, который сообщает Spring, чтобы он перенаправлял вас на канал https.

Так вы пытались:

<security:intercept-url pattern="/**/*?secure*" requires-channel="https"/>

это не работает, попробуйте сбежать "?":

<security:intercept-url pattern="/**/*\?secure*" requires-channel="https"/>

Я только что посмотрел на источник для FilterChainProxy (в 3.0.5.RELEASE), и он использует регулярные выражения для сопоставления с шаблонами.Таким образом, вы можете взглянуть на:

org.springframework.security.web.util.RegexUrlPathMatcher#pathMatchesUrl(Object compiledPath, String url)

или

org.springframework.security.web.FilterChainProxy#getFilters(String url)

, чтобы точно узнать, какой шаблон вам нужен.

Так что, даже если весна в настоящее время не поддерживает '?'знак, что вы можете расширить свой UrlPathMatcher и вставить его в FilterChainProxy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...