Spring Security 4:如何忽略尾部斜杠

时间:2016-07-05 16:05:36

标签: java spring-mvc spring-security

我有一个Spring Boot应用程序,我使用的是Spring Security(4.0.4)。

端点的当前安全配置(使用Java)允许调用/some/endpoint但不能调用/some/endpoint/

我在这里搜索了文档,但是我没有看到像开关那样忽略尾随空格的东西。例如,使用Spring MVC,我可以执行以下操作:

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

当然,上面的代码改变了与我想要的相反的行为,但它只是用来演示我想用Spring Security做什么。

我的(减少的)安全配置:

@Bean
public ResourceServerConfigurer resourceServerConfigurer(final ScopesProperties oauthProperties) {
    return new ResourceServerConfigurerAdapter() {
        @Override
        public void configure(final HttpSecurity http) throws Exception {
            http.sessionManagement().sessionCreationPolicy(NEVER).and()
                    .authorizeRequests()
                    .antMatchers(GET, "/foo")
                    .access(oauthProperties.getFooRead())
                    .antMatchers(GET, "/bar/*")
                    .access(oauthProperties.getBarRead())
                    .antMatchers(PUT, "/bar/*")
                    .access(oauthProperties.getBarWrite())
                    // everything else
                    .anyRequest().denyAll();
        }

我知道我可以使用我想避免的正则表达式匹配器,主要是出于同样的原因,因为我想避免为每个端点设置一个额外的规则,只是为了批准同一个端点一个尾随斜线。我必须为每个端点执行此操作,这很容易出错。我也知道我可以使用蚂蚁匹配器并设置/foo/**的路径。问题在于我想控制具有不同范围的子资源。

所以问题是:如何告诉Spring Security全局忽略尾部斜杠?

提前致谢

1 个答案:

答案 0 :(得分:1)

万一有人遇到同样的问题,有一个解决方案。它被称为MvcRequestMatcher,您可以在Spring Documentation

中阅读所有相关信息。

这是主要部分:

  

问题是我们的安全规则只是保护/管理员。我们可以为Spring MVC的所有排列添加额外的规则,但这将非常冗长乏味。

     

相反,我们可以利用Spring Security的MvcRequestMatcher。以下配置将通过使用Spring MVC匹配URL来保护Spring MVC将匹配的相同URL。

以下是配置现在的样子:

@Bean
public ResourceServerConfigurer resourceServerConfigurer(final ScopesProperties oauthProperties) {
    return new ResourceServerConfigurerAdapter() {
        @Override
        public void configure(final HttpSecurity http) throws Exception {
            http.sessionManagement().sessionCreationPolicy(NEVER).and()
                .authorizeRequests()
                .mvcMatchers(GET, "/foo")
                .access(oauthProperties.getFooRead())
                .mvcMatchers(GET, "/bar")
                .access(oauthProperties.getBarRead())
                .mvcMatchers(PUT, "/bar")
                .access(oauthProperties.getBarWrite())
                // everything else
                .anyRequest().denyAll();
    }