嗨,我正在学习 Spring,但是当我觉得开始使用它很方便时,当然我又遇到了问题......但是这次即使经过几个小时的搜索也找不到任何解释。
问题 当执行 Post 请求时,我收到 401。如果我执行 get 请求,则一切正常。 我创建了多个带或不带 Requestbody 的 Post 请求,但总是出现同样的问题。另外,如果我使用以下方法禁用身份验证:
.requestMatchers("/api").permitAll()
,我仍然会收到 POST 请求的 401。
首先我想到了 cors,但首先我使用的是邮递员,其次没有 json 的 Post 应该不是问题。通常。
重现问题
我创建了以下最小项目来重现该问题:
Spring 安全配置
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.anyRequest().authenticated()
)
.httpBasic(Customizer.withDefaults());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails userDetails = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(userDetails);
}
}
弹簧控制器
@RestController
@RequestMapping("/api")
public class MainController {
@GetMapping
public String helloGet() {
return "Hello from Get";
}
@PostMapping
public String helloPost() {
return "Hello from Post";
}
}
尝试添加
http.csrf(csrf -> csrf.disable()); // or .csrf(AbstractHttpConfigurer::disable)
进入你的
securityFilterChain
方法。
如果有效,则确认“问题”是 CSRF。然后我建议阅读有关 CSRF 的更多内容,以检查它是否可以安全地针对您的用例禁用它:
或者调查更多有关如何使 POST 请求工作的信息 with CSRF: