You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无WebSecurityConfigurerAdapter的Spring Security遇Postman 403错误求助

Spring Security 无WebSecurityConfigurerAdapter下403错误解决

你的代码核心问题是未配置认证机制——虽然定义了用户信息和密码编码器,但SecurityFilterChain里只设置了授权规则,Spring Security无法验证请求中的用户身份,因此返回403。

问题分析

  • 你将会话策略设为SessionCreationPolicy.STATELESS(无状态),但未配置对应的认证方式(如HTTP Basic),导致请求/secure时,系统无法识别用户身份。
  • 授权规则要求/secure需要ADMIN或USER角色,但没有途径让系统获取请求中的用户凭证进行验证。

修复方案

在securityFilterChain方法中添加HTTP Basic认证配置,让Spring Security支持通过请求头传递用户凭证进行身份验证:

修改后的SecurityConfig代码:

package com.example.securityspring.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
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.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    protected SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .csrf((csrf) -> csrf.disable())
                .cors((cors) -> cors.disable())
                // 添加HTTP Basic认证配置
                .httpBasic(httpBasic -> httpBasic)
                .authorizeHttpRequests(
                        authorizationManagerRequestMatchers -> authorizationManagerRequestMatchers
                                .requestMatchers(HttpMethod.GET, "/", "/open").permitAll()
                                .requestMatchers(HttpMethod.GET, "/secure").hasAnyRole("ADMIN", "USER")
                                // 其他请求都需要认证
                                .anyRequest().authenticated()
                )
                .sessionManagement(sessionManagement -> sessionManagement
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .build();
    }

    @Bean
    public PasswordEncoder encoder() {
        return NoOpPasswordEncoder.getInstance();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.builder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();
        // 可选:添加ADMIN用户用于测试
        UserDetails admin = User.builder()
                .username("admin")
                .password("admin")
                .roles("ADMIN")
                .build();
        return new InMemoryUserDetailsManager(user, admin);
    }
}

Postman请求测试

访问/secure接口时,在Postman中按以下步骤配置:

  1. 选择GET方法,输入请求地址
  2. 切换到Authorization标签页
  3. 类型选择Basic Auth
  4. 输入用户名user和密码password(或admin/admin)
  5. 发送请求,即可正常返回"secure url"

额外提示

  • NoOpPasswordEncoder仅适合测试环境,生产环境请使用BCryptPasswordEncoder等安全的密码编码器。
  • 添加.anyRequest().authenticated()规则可确保未匹配的请求都需要认证,提升系统安全性。

内容的提问来源于stack exchange,提问作者Олег Денькович Java

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:20:18