URL中的Spring Security,尾部斜杠和点

我使用Spring Security 3.1.4来保护部署到Tomcat的Spring MVC 3.2.4应用程序。 我有以下Spring Security配置:

            

我注意到没有尾部斜杠(例如, /about )的URL模式与具有尾部斜杠的URL(例如, /about/ )不匹配,反之亦然。 换句话说,具有斜杠的URL和没有斜杠的相同URL被Spring Security视为两个不同的URL。 可以使用两个安全规则来解决此问题:

   

有更好的解决方案吗?

我知道path-type="regex"允许用正则表达式定义URL模式,但是如果可能的话,我想避免任何不必要的复杂性。

更新

正如Adam Gent所指出的,还有一个问题涉及带有点的URL: /about.foo/about被Spring MVC视为相同的URL。 但是,Spring Security将它们视为两个不同的URL。 因此,可能还需要一个安全规则:

  

Spring Security 4.1+

Spring Security现在添加了一个新的匹配器,它知道你的Spring MVC URL匹配配置。 这告诉Spring Security根据Spring MVC使用的相同规则匹配路径,从而消除URL有效但不安全的可能性。

首先,您需要使用新的MVC匹配器替换任何旧匹配器。 Spring Security现在与您同步,但是您已经配置了Spring MVC,因此您可以自由添加或删除任何路径匹配配置。 我建议尽可能坚持使用默认值。

Java配置

如果你使用的是antMatchers ,你现在应该使用mvcMatchers

 protected configure(HttpSecurity http) throws Exception { http.authorizeRequests() .mvcMatchers("/about").hasRole("USER"); } 

XML配置

您需要将属性request-matcher添加到您的http标记:

    

完整参考

请注意,您也不应再为“ROLE_”添加前缀,因为Spring Security会自动为您执行此操作。


4.1之前的Spring Security

我无法找到一种方法来处理Spring Security中的尾部斜杠和路径后缀。 显然,可以编写一个正则表达式来处理这些情况,但这似乎使安全规则过于复杂并容易出错。 我希望尽可能自信,我不会意外地暴露资源。

因此,我的方法是通过将路径匹配器配置为严格关于尾部斜杠和后缀来在Spring中禁用此行为。

Java配置

 @Configuration public class ServletConfig extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(final PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false); configurer.setUseTrailingSlashMatch(false); } } 

XML配置

    
  

在Spring Security 3.1.4中也适用于我。 这可以保护/about/about//about/anything_else