Spring Security:如何用标志强制https?

时间:2011-06-22 14:24:56

标签: https spring-security

使用Spring安全性我配置我的网络应用程序的部分需要通过带有security:intercept-url标记的https进行保护。

例如:

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

这样所有在文件名中包含“secure”的请求或在最低级别包含“secure”的目录都会获得https,其余的将获得http。

有没有办法使用旗帜制作Spring force https? 在“?”之后,我无法获得任何工作。一个网址。

  • http://domain/abc?secure=true =&gt; HTTPS
  • http://domain/abc => http

然后,Spring会将每个请求透明地重定向到http://domain/abc?secure=truehttps://domain/abc?secure=true

有没有办法实现这一目标? 示例中的第一个模式实现了在“?”之前发生“安全”的结果,但我正在寻找一个解决方案/模式,在“?”之后有一个标志。仅

2 个答案:

答案 0 :(得分:3)

让Spring在“?”之后考虑片段在url中,stripQueryStringFromUrls必须设置为false。

这是我在Spring forum中找到的解释: 加载此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"/>

终于有效了。

答案 1 :(得分:2)

据我所知,你想要一个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