Java Spring Security - User.withDefaultPasswordEncoder()已弃用?

sam*_*n71 15 java spring spring-mvc spring-security spring-boot

我是java spring安全的新手,并且遵循Spring.io 教程指南.作为其中的一部分,我WebSecurityConfig根据需要编辑了课程:

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

    @Bean
    @Override
    public UserDetailsService userDetailsService() {
        UserDetails user =
         User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();

    return new InMemoryUserDetailsManager(user);
    }
}
Run Code Online (Sandbox Code Playgroud)

在该userDetailService()方法中,它使用withDefaultPasswordEncoder()现在已弃用,如文档中所示:withDefaultPasswordEncoder()

不幸的是,我没有找到替代方案,在不使用弃用方法的情况下完成本教程.如果可能,有人能为此提供替代方案吗?

谢谢!

注意:我附上了几个错误的屏幕截图,以及我的gradle文件

图1:我收到的错误

图2:我的gradle文件

Twi*_*wiN 25

编辑:删除旧答案,误解了这个问题.这是新的:

User.withDefaultPasswordEncoder() 仍然可以用于演示,你不必担心这是你正在做什么 - 即使它已被弃用 - 但在生产中,你的源代码中不应该有纯文本密码.

你应该做什么而不是使用当前的userDetailsService()方法如下:

private static final String ENCODED_PASSWORD = "$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2";


@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication()
        .passwordEncoder(passwordEncoder())
        .withUser("user").password(ENCODED_PASSWORD).roles("USER");
}


@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
Run Code Online (Sandbox Code Playgroud)

ENCODED_PASSWORDsecret123编码与BCrypt.您也可以通过编程方式对其进行编码:passwordEncoder().encode("secret123").

这样,即使您将代码推送到公共存储库,人们也不会知道密码,因为ENCODED_PASSWORD只显示密码的编码版本而不是纯文本版本,但是因为您知道这$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2实际上是字符串的编码密码secret123而其他人则没有,您的凭证内存用户user:secret123不会受到损害.

请注意,为了示例,我将其保留在静态变量中.


suj*_*h s 9

在 Spring Security 5.7.3 中,WebSecurityConfigurerAdapter 将被弃用,因此我们必须 提供 UserDetailsS​​ervice 接口的 bean

示例代码

    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public class WebSecurity {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.formLogin(form -> {
            form.loginPage("/login")
                    .permitAll();
        }).authorizeRequests();
        return http.build();
    }


    @Bean
    @Description("In memory Userdetails service registered since DB doesn't have user table ")
    public UserDetailsService users() {
        // The builder will ensure the passwords are encoded before saving in memory
        UserDetails user = User.builder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();
        UserDetails admin = User.builder()
                .username("admin")
                .password("password")
                .roles("USER", "ADMIN")
                .build();
        return new InMemoryUserDetailsManager(user, admin);
    }

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

}
Run Code Online (Sandbox Code Playgroud)