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

Java Spring Security:User.withDefaultPasswordEncoder()已弃用?新手求教

解决Spring Security中User.withDefaultPasswordEncoder()被弃用的问题

嘿,作为刚踩过这个坑的Spring Security新手,我来给你捋捋怎么解决这个问题!官方弃用这个方法其实是出于安全考虑——withDefaultPasswordEncoder()会把密码的明文和编码器信息一起存在内存里,只适合快速演示,绝对不能用在生产环境,所以官方就把它标记为弃用了。下面给你两种实用的替代方案,分别适配学习演示和生产场景:

方案1:学习/演示场景(用内存用户)

这种情况和你跟着教程做的场景最匹配,我们显式配置一个密码编码器,然后手动给密码加密:

首先在你的WebSecurityConfig类里添加一个PasswordEncoder的Bean:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    // 配置密码编码器,这里用BCrypt(Spring推荐的强哈希算法)
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    // 配置内存用户,用上面的编码器加密密码
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user")
            // 这里用passwordEncoder.encode()来加密你的明文密码
            .password(passwordEncoder().encode("your-password"))
            .roles("USER");
    }
}

方案2:生产环境场景(从数据库读取用户)

如果之后你要对接数据库,密码在数据库里已经是加密好的(比如用BCrypt存储),只需要确保配置了PasswordEncoder,Spring Security会自动用它来验证密码:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    // 配置从数据库读取用户信息
    @Bean
    public UserDetailsService userDetailsService() {
        JdbcUserDetailsManager userDetailsManager = new JdbcUserDetailsManager(dataSource);
        // 如果你用的是自定义的用户表结构,可以在这里设置查询语句,默认用Spring的内置表结构
        // userDetailsManager.setUsersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username = ?");
        // userDetailsManager.setAuthoritiesByUsernameQuery("SELECT username, authority FROM authorities WHERE username = ?");
        return userDetailsManager;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 和之前的配置一样
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}

简单总结一下:核心就是显式配置PasswordEncoder,再也不用依赖那个不安全的弃用方法了。这样既符合官方的安全规范,也能完美替代原来的功能~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:01:40