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
相关产品推荐
相关产品推荐

