问题自述

在整合Security6.3的时候,我阅读别人写的博客,发现不管怎么样我访问我的接口总是403,登陆接口都进不去,我用的自定义登陆接口。

HTTP 403 是什么?

HTTP 403(Forbidden)错误通常表示请求已被服务器理解,但服务器拒绝授权。

需要注意的是,该错误不同于 401 错误,后者表示服务器需要对客户端进行身份认证,但尚未收到有效凭证。

“401” 表示需要认证,“403” 表示认证过了(或者不需要认证),但是没有权限。

导致403原因

  1. 权限配置问题
    • 确保你的安全配置正确地定义了哪些用户或角色可以访问哪些资源。例如,使用http.authorizeRequests()方法来配置访问规则。
  2. CSRF保护
    • 如果你的应用是前后端分离的,可能需要关闭CSRF保护。可以通过配置http.csrf(AbstractHttpConfigurer::disable)来实现。
  3. 自定义拦截器或者过滤器
    • 可能由于配置不当,可以尝试检查一遍

Spring Security 默认启用跨站请求伪造(CSRF)保护。CSRF 是一种通过欺骗受害者提交恶意请求并利用受害者的凭证代表其执行非预期功能的攻击。如果用于防范此类攻击的 CSRF token 丢失或不正确,服务器也可能会响应 403 错误。

解决 POST 请求中的 403 错误

默认情况下,Spring Security 会启用 CSRF 保护。如果请求头中缺少 CRSF token,服务器就会响应 403 错误。此行为不针对任何服务器环境,包括 localhost、暂存或生产环境。

通常我们都会做前后端分离,所以需要禁用CSRF保护,如果你的后端出现这个问题可以看看你是不是这样写的http.csrf(Customizer.withDefaults()),这个其实是启用,默认开启的。

我们可以通过禁用 CSRF 保护来解决这个问题:

1
2
3
4
5
6
7
8
9
10
11
12
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
// 放行登录,注册页面
.requestMatchers("/auth/login", "/auth/register").permitAll()
// 拦截其他所有请求
.anyRequest().authenticated()
)
.csrf(AbstractHttpConfigurer::disable); // 禁用CSRF
return http.build();
}

在上面的代码中,我们通过调用 disable() 方法禁用了 CSRF 保护。这里注意,这里的配置不携带凭证(不登陆)是无法访问其他页面的,只能请求注册,登陆。如果想放行所有请求,可以把requestMatchers("/auth/login", "/auth/register")替换为anyRequest(),意为任何请求。

再次访问可能会出现预期的结果,如果没有,请再次检查你的配置文件。

不过,需要注意的是,一般不建议在生产环境中禁用 CRSF 保护。CRSF 保护是防止跨站伪造攻击的重要安全措施。因此,建议在状态更改操作的请求头中包含 CRSF token。

认证凭证

请求需要认证的端点,但是未提供认证凭证,或者是错误的凭证,都可能会导致 Spring Boot 应用程序出现 403 错误。

让我们修改 SecurityFilterChain,以对服务器的所有请求进行认证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
// 放行登录,注册页面
.requestMatchers("/auth/login", "/auth/register").permitAll()
// 拦截其他所有请求
.anyRequest().authenticated()
)
.httpBasic(Customizer.withDefaults())
.formLogin(Customizer.withDefaults())
.cors(AbstractHttpConfigurer::disable)
.csrf(AbstractHttpConfigurer::disable);
return http.build();
}

在上面的代码中,我们将应用程序配置为在允许访问前对每个请求进行身份认证。如果我们在未提供正确凭证的情况下向端点发出 POST 请求,服务器将响应 403 错误。

参考:https://springdoc.cn/java-spring-fix-403-error/


本站由 Natuie 使用 Stellar 1.26.8 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

本站总访问量次 | 本站总访客数人次
载入天数...载入时分秒...