我在 Java 17 中遇到 Spring Security 配置问题。我希望允许对“/api/register”端点进行未经身份验证的访问,同时要求对所有其他端点进行身份验证。这是我当前的配置:
@Bean
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests.requestMatchers("/api/register").permitAll().
anyRequest().authenticated());
http.formLogin(withDefaults());
http.httpBasic(withDefaults());
return http.build();
}
我尝试了不同的配置,但仍然不起作用。不幸的是,
antMatchers
方法似乎对我不起作用。在旧版本的 Spring 中,我可以实现这一点。您能帮我确定我当前的设置有什么问题吗?
您当前的配置看起来几乎是正确的,但是在authorizeHttpRequests方法中有一个小错误。您应该使用 mvcMatchers 来指定 URL 模式,而不是使用 requestMatchers。这是更正后的配置:
java
@Bean
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests.mvcMatchers("/api/register").permitAll()
.anyRequest().authenticated());
http.formLogin(withDefaults());
http.httpBasic(withDefaults());
return http.build();
}
此配置应允许对“/api/register”端点进行未经身份验证的访问,同时要求对所有其他端点进行身份验证。
由于您没有使用 Spring Security 5 或更高版本,因此 mvcMatchers 方法不可用。在这种情况下,您可以使用 antMatchers 方法来实现所需的行为。这是您的版本的配置:
java
@Bean
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests.antMatchers("/api/register").permitAll()
.anyRequest().authenticated());
http.formLogin(withDefaults());
http.httpBasic(withDefaults());
return http.build();
}
此配置应允许对“/api/register”端点进行未经身份验证的访问,同时要求对所有其他端点进行身份验证。请注意,建议在 Spring Security 5 及更高版本中使用 mvcMatchers,因为它通过匹配 Spring MVC 用于匹配的相同规则来提供更好的安全性(当使用 @RequestMapping 注释时) 1 。但是,由于您使用的是旧版本,antMatchers 应该适合您的情况。