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

Spring Security配置过时求助:求最新配置方法(Spring新手)

Spring Security 最新配置指南

你的问题

系统提示Spring Security配置已过时,作为Spring新手,需要最新的配置方法。

Spring Security过时配置截图

最新配置方案(适配Spring Security 6.x及以上版本)

Spring Security 5.7+就已标记WebSecurityConfigurerAdapter为过时,现在推荐通过注册SecurityFilterChain Bean完成配置,以下是常用场景的配置示例:

1. 基础内存用户+路径权限配置

创建配置类,直接定义Bean即可:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
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
@EnableWebSecurity
public class SecurityConfig {

    // 配置请求权限与认证规则
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                // 开放无需认证的路径
                .requestMatchers("/public/**", "/login", "/register").permitAll()
                // 其余所有请求必须认证
                .anyRequest().authenticated()
            )
            // 启用表单登录,支持自定义登录页
            .formLogin(form -> form
                .loginPage("/custom-login") // 可选,不配置则用默认登录页
                .permitAll()
            )
            // 配置退出登录
            .logout(logout -> logout
                .permitAll()
            );
        return http.build();
    }

    // 密码编码器(Spring Security 5+强制要求,禁止明文密码)
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    // 内存用户示例,实际项目建议对接数据库
    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails regularUser = User.withUsername("user")
            .password(passwordEncoder().encode("user123"))
            .roles("USER")
            .build();

        UserDetails adminUser = User.withUsername("admin")
            .password(passwordEncoder().encode("admin456"))
            .roles("ADMIN")
            .build();

        return new InMemoryUserDetailsManager(regularUser, adminUser);
    }
}

2. 数据库用户适配(扩展)

如果用户数据存在数据库,只需替换UserDetailsService的实现:

@Bean
public UserDetailsService userDetailsService(UserRepository userRepo) {
    return username -> {
        // 替换为你项目的实体类和Repository
        com.yourpackage.entity.User dbUser = userRepo.findByUsername(username)
            .orElseThrow(() -> new UsernameNotFoundException("用户不存在:" + username));
        
        return User.withUsername(dbUser.getUsername())
            .password(dbUser.getEncryptedPassword())
            .roles(dbUser.getRoles().toArray(new String[0]))
            .build();
    };
}

核心变化点

  • 不再需要继承WebSecurityConfigurerAdapter(该类已废弃)
  • 用SecurityFilterChain Bean集中配置所有安全规则
  • 必须显式配置PasswordEncoder,不能再使用明文密码
  • 用authorizeHttpRequests替代旧版的authorizeRequests方法

内容的提问来源于stack exchange,提问作者Oneness

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:25:27