spring-security CSRF令牌未随 Spring Boot 提供2.7.1

dfddblmv  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(184)

我使用的是2.6.x版本的spring Boot ,我已经切换到2.7.1版本,并修改了一些安全配置来匹配新的格式。
但是现在CSRF令牌不再为我生成并注入到我的登录表单中,可能与其他表单相同,但我无法测试它。
这是我的安全配置

@Order(1)
  @Bean
  public SecurityFilterChain actuatorFilterChain(final HttpSecurity http) throws Exception {
    // @formatter:off
    return http
      .requestMatchers().antMatchers("/jobs/**", "/actuator/**").and()
      .authorizeRequests().antMatchers("/jobs/**", "/actuator/**").hasRole("SYSTEM").and()
      .httpBasic()
        .and()
      .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .build()
      ;
    // @formatter:on
  }

  @Bean
  public SecurityFilterChain filterChain(final HttpSecurity http) throws Exception {

      // @formatter:off
      return http
        .requestMatchers().antMatchers(applicationRoutes).and()
        .authorizeRequests()
          .antMatchers(applicationRoutes).hasAnyRole(applicationAuthorities).and()
        .csrf().disabled().and()
        .formLogin()
          .loginPage("/login")
          .defaultSuccessUrl("/")
          .and()
        .logout()
          .logoutSuccessUrl("/")
          .and()
        .headers()
          .httpStrictTransportSecurity().disable()
        .and()
        .build()
      ;
      // @formatter:on
    }
  }

我的登录页面

<html>

<head>
</head>

<body>

          <form th:action="@{/login}"
                method="POST"
                >
            <div class="field">
              <input type="text"
                     id="username"
                     name="username"
                     placeholder="&#xf007   Nom d'utilisateur"
                     style="font-family:Lato,'Helvetica Neue', FontAwesome">
            </div>
            <div class="field">
              <input type="password"
                     id="password"
                     name="password"
                     placeholder="&#xf023    Mot de passe"
                     style="font-family:Lato,'Helvetica Neue', FontAwesome">
            </div>

            <button class="ui primary button"
                    style="width:100%"
                    type="submit">Connexion</button>
          </form>

</body>

</html>

显示给我的错误是一个405,说/login不支持POST。但是发送到浏览器的表单中不包括CSRF令牌。
我怀疑我错过了一些新的配置。但我不知道在哪里寻找。

lnxxn5zx

lnxxn5zx1#

http.requestMatchers()添加到筛选器链时,FilterChainProxy将忽略不匹配的路由。在您的情况下,/login不与筛选器链匹配。因此,您的登录页没有可用的CSRF令牌。
请确保示例中的applicationRoutes字段中存在/login,以解决此问题。您可以使用.mvcMatchers("/login").permitAll()permitAll规则添加到/login路由,或者将.permitAll()添加到.formLogin() DSL。

相关问题