我正在学习spring security,我从https://spring.io/guides/tutorials/spring-boot-oauth2/碰到了这段代码
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**", "/webjars/**", "/error**")
.permitAll()
.anyRequest()
.authenticated();
}
我删除了.antMatcher("/**")
,并且代码仍然有效。
我了解**
匹配路径中的零个或多个目录,因此我认为antMatcher("/**").authorizeRequestes().antMatcher("/login")
会匹配直接或间接位于根路径下的"/login"
,即我希望它匹配类似{{1 }}和/login
,但事实并非如此,它仅匹配根路径正下方的/demo/login
。
那么,/login
到底需要什么呢?
答案 0 :(得分:2)
它们是不同的东西。
http.antMatcher()
配置此SecurityFilterChain
处理的URL。默认为匹配所有URL。这就是为什么删除http.antMatcher("/**")
的原因。
http.authorizeRequests()
配置URL的授权事项,例如是否需要进行身份验证或仅某些角色可以访问它等。
因此,如果URL与http.antMatcher()
不匹配,Spring安全将不会处理它,并且http.authorizeRequests()
将不适用于此URL。换句话说,为了使在http.authorizeRequests()
中配置的URL生效,它应该由Spring Security处理并在http.antMatcher()
中进行匹配。
答案 1 :(得分:1)
请注意,第一个是单数antMatcher
,第二个是复数antMatchers
,并且示例中的缩进方式有所不同。
实际上,问题中的示例未正确缩进。正确的缩进是:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**", "/webjars/**", "/error**")
.permitAll()
.anyRequest()
.authenticated();
}
那是因为它们适用于两个完全不同的对象:
第一次调用将应用于HttpSecurity
对象,并指定一个 master 过滤器,该过滤器甚至在考虑安全性之前就已应用。
默认的主过滤器是AnyRequestMatcher
,而Javadoc表示:
匹配任何提供的请求。
调用antMatcher("/**")
时,您使用模式/**
用AntPathRequestMatcher
替换并过滤{em> ,并且javadoc说:
使用模式值
/**
或**
被视为通用匹配,它将匹配任何请求。
如您所见,调用antMatcher("/**")
无效,除了明确说明对所有请求都应用了安全性之外。
第二个调用应用于一个ExpressionInterceptUrlRegistry
对象,并指定一个经过“蚂蚁”过滤的“ 规则”。可以定义许多规则,例如在示例antMatchers(...)
和anyRequest()
中,每个都启动一个新规则,并且您可以有多个antMatchers(...)
规则不同的规则。
顺序检查规则,直到匹配到传入请求为止。
主过滤器和规则过滤器必须独立匹配请求,以便如规则所指定的那样保护请求的安全。 permitAll()
,denyAll()
,authenticated()
,hasRole("ROLE_FOO")
等。