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

问题描述 投票:0回答:1

我有一个 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 全局忽略尾部斜杠?

java spring-mvc spring-security
1个回答
3
投票

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

中阅读有关它的所有内容

主要部分如下:

问题是我们的安全规则只保护/admin。我们可以为 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();
    }
© www.soinside.com 2019 - 2024. All rights reserved.