我使用的是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=" Nom d'utilisateur"
style="font-family:Lato,'Helvetica Neue', FontAwesome">
</div>
<div class="field">
<input type="password"
id="password"
name="password"
placeholder=" 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令牌。
我怀疑我错过了一些新的配置。但我不知道在哪里寻找。
1条答案
按热度按时间lnxxn5zx1#
将
http.requestMatchers()
添加到筛选器链时,FilterChainProxy
将忽略不匹配的路由。在您的情况下,/login
不与筛选器链匹配。因此,您的登录页没有可用的CSRF令牌。请确保示例中的
applicationRoutes
字段中存在/login
,以解决此问题。您可以使用.mvcMatchers("/login").permitAll()
将permitAll
规则添加到/login
路由,或者将.permitAll()
添加到.formLogin()
DSL。