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

Ans*_*gar 6 https spring-security

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

例如:

<security:intercept-url pattern="/**/*secure*" requires-channel="https"/>
<security:intercept-url pattern="/**" requires-channel="http" />    
Run Code Online (Sandbox Code Playgroud)

这样,在文件名中包含"安全"的所有请求或在最低级别包含"安全"的目录获取https,其余的将获得http.

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

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

那么Spring将透明地重定向每个请求要http://domain/abc?secure=truehttps://domain/abc?secure=true.

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

Ans*_*gar 3

让 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样的模式

<security:intercept-url pattern="/**/*?secure=true*" requires-channel="https"/>
Run Code Online (Sandbox Code Playgroud)

终于起作用了。