使用以下代码传递POST请求时面临401未经授权|春季安全

问题描述 投票:0回答:2

当然!您可以将以下文本直接粘贴到您的 Stack Overflow 问题中:


标题:Spring Security POST 请求因 401 未经授权而失败

描述: 我的 Spring Boot 应用程序遇到问题,其中 POST 请求失败并出现 401 未经授权错误。以下是我的 Spring Security 配置:

package com.spboot.DohaRiff.config;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
 
@Configuration
public class SpringSecurityConfig {
 
    SecurityFilterChain securityFilterChain(HttpSecurity http)throws Exception{
        http.csrf((csrf) -> csrf.disable())
                .authorizeHttpRequests((authorize)->{
                   authorize.requestMatchers(HttpMethod.POST,"/api/**").hasRole("ADMIN");
                    authorize.requestMatchers(HttpMethod.PUT,"/api/**").hasRole("ADMIN");
                    authorize.requestMatchers(HttpMethod.DELETE,"/api/**").hasRole("ADMIN");
                    authorize.anyRequest().authenticated();
                }).httpBasic(Customizer.withDefaults());
        return http.build();
    }
 
    @Bean
    public static PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
 
    @Bean
    public UserDetailsService userDetailsService(){
        UserDetails hulkNaik = User.builder()
                .username("hulkNaik")
                .password(passwordEncoder().encode("Pass123"))
                .roles("USER")
                .build();
 
        UserDetails admin = User.builder()
                .username("admin")
                .password(passwordEncoder().encode("admin"))
                .roles("ADMIN")
                .build();
 
        return new InMemoryUserDetailsManager(hulkNaik,admin);
    }
}

这是我尝试在 POST 请求中传递的标头:

{
    "id": 4,
    "title": "TEST",
    "description": "TES",
    "userComments": "TEST",
    "author": "Host",
    "source": "Saped"
}

问题: 使用 Postman 发送 POST 请求时,我收到 401 未经授权错误。不过,我可以使用浏览器登录,没有任何问题。

其他背景

  • 我已将 Spring Security 配置为限制对具有 ADMIN 角色的用户的 POST、PUT 和 DELETE 请求。
  • 我已确保发送请求时的凭据正确。
  • 我尝试了请求标头的不同变体,但没有成功。

预期行为: 我希望 POST 请求能够成功进行身份验证和处理,并返回适当的响应。

实际行为: POST 请求返回 401 未经授权错误。

重现步骤

  1. 使用 Postman 和提供的标头发送 POST 请求。
  2. 收到 401 未经授权的错误响应。

任何有关解决此问题的见解或建议将不胜感激。谢谢!

spring-boot spring-security
2个回答
0
投票

您介意分享代码仓库吗?


0
投票

看起来您没有正确传递

Authorization
标头。由于您已启用基本身份验证,因此请确保添加
Authorization
标头以及以 base64 编码的
username:password
字符串。

例如:

Authorization: Basic ZGVtbzpwQDU1dzByZA==

© www.soinside.com 2019 - 2024. All rights reserved.