如何在Spring中仅将安全路径的子路径列入白名单?

时间:2018-11-06 10:47:18

标签: java spring spring-security spring-web

我使用的spring-boot-starter-security默认情况下会自动保护我所有的@GetMapping其余端点。

问题:如何只将不应该保护的子路径列入白名单?

我尝试如下:

@Configuration
public class DocumentsSecurityConfiguration implements WebSecurityConfigurer<WebSecurity> {
    @Override
    public void init(WebSecurity builder) { }

    //should allow unauthenticated access
    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/documents/**");
    }
}

但是:localhost:8080/documents根路径应该保持安全。仅/documents/123之类的子路径应保持打开状态。

问题:当我现在访问根路径/documents时,它不再受保护。

我的AntMatcher错误吗?

2 个答案:

答案 0 :(得分:1)

此行为是一种优化,请参见thread priority

  

使用模式值/****被视为通用匹配,它将匹配任何请求。以/**结尾的模式(没有其他通配符)通过使用子字符串匹配进行优化-/aaa/**的模式将匹配/aaa/aaa/和任何子目录,例如/aaa/bbb/ccc

有一些可能的方法可以解决您的问题:

答案 1 :(得分:0)

我想也许是这样的事情:

@Configuration
@EnableWebSecurity
@Order(SecurityProperties.BASIC_AUTH_ORDER)
@Slf4j
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private static final String[] AUTH_WHITE_LIST = {
        // swagger-ui
          "/v2/api-docs"
        , "/swagger-resources"
        , "/swagger-resources/**"
        , "/configuration/security"
        , "/swagger-ui.html"
        , "/webjars/**"
        , "/security/**"
        // spring actuator
        , "/actuator"
        , "/actuator/**"
    };

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.anonymous().and()
                .authorizeRequests().antMatchers(AUTH_WHITE_LIST).permitAll();
    }
}

请注意订单,Spring安全性基于文件管理器,基本上订单很重要。如果有其他匹配器拒绝该请求,它将不会到达此配置。

对于您提到的问题,

我认为您必须编写一个自定义过滤器来处理它。仅允许“ / documents”带有一些其他路径,但停止访问“ / documents”。

我个人建议您调整url设计,在这种情况下也许将其更改为“ / documents / all”比“ / documents”更好?尽管与Internet上的其他api教程有点冲突。

代码来自我的项目之一,但是一些不相关的部分已被删除。希望这会有所帮助。