我使用的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
错误吗?
答案 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教程有点冲突。
代码来自我的项目之一,但是一些不相关的部分已被删除。希望这会有所帮助。