http.antMatcher(“ / **”).authorizeRequests()。antMatchers(“ /”)中的antMatcher(“ / **”)有什么需要?

时间:2019-12-26 06:53:12

标签: java spring spring-boot spring-security

我正在学习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到底需要什么呢?

2 个答案:

答案 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")等。