我正在使用Sping Boot 3和Spring Security 6。我已经配置了以下安全链
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(requests -> {requests
.requestMatchers("/", "/login").permitAll(); //these urls don't require authentication
//.anyRequest().permitAll(); //all other requests are authenticated
requests.requestMatchers(HttpMethod.POST).hasRole("ADMIN");
requests.requestMatchers(HttpMethod.GET).hasAnyRole("USER", "ADMIN");
requests.anyRequest().authenticated();
})
.httpBasic(Customizer.withDefaults()) //enable basic authentication, used for APIs
.formLogin(form -> form //enable form based authentication, for UI
.loginPage("/login")
.permitAll());
return http.build();
}
为GET方法配置的规则工作正常,但当我使用POST方法时,事情并不像预期的那样工作。
在使用POST方法时,我收到了USER和ADMIN角色的401未经授权的错误,而在预期具有USER角色的用户出现403错误,并且允许具有ADMIN角色的用户访问。
我的配置有问题吗?
2条答案
按热度按时间g6baxovj1#
看来您已经正确地为GET和POST方法定义了授权规则。规则
requests.requestMatchers(HttpMethod.POST).hasRole("ADMIN");
指定只有具有“ADMIN”角色的用户可以使用HTTP POST方法访问资源。但是,由于您提到在使用POST方法访问资源时,USER和ADMIN角色都出现了401 unauthorized错误,因此可能是用户在应用授权规则之前没有正确进行身份验证。
要解决此问题,您可以尝试以下步骤:
1.通过在您的控制器或服务类中打印Authentication对象来检查用户是否正在正确地进行身份验证。您可以使用以下代码获取经过身份验证的用户的信息:
通过打印经过身份验证的用户的权限,检查用户是否具有分配的正确角色:
如果未正确验证用户,请检查登录页是否配置正确以及用户提供的凭据是否正确。
如果用户正在正确地进行身份验证,但仍然无法访问资源,您可以尝试修改POST请求的授权规则,以允许所有经过身份验证的用户:
这将允许所有经过身份验证的用户使用POST方法访问资源。之后可以在控制器中添加逻辑,以根据用户的角色限制访问。
我希望这对你有帮助!
axr492tv2#
我找到问题所在了。我必须禁用csrf的POST方法工作。
这就是在 Boot 3 /springsecurity 6中如何实现的
希望这能帮上忙。