spring-security Java Spring安全性-不赞成使用.withDefaultPasswordEncoder()?

14ifxucb  于 2022-11-11  发布在  Spring
关注(0)|答案(3)|浏览(203)

我对java Spring Security 很陌生,并且一直在关注Spring.io tutorial guide。作为此工作的一部分,我根据需要编辑了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);
    }
}

userDetailService()方法中,它使用withDefaultPasswordEncoder(),该方法现在已被弃用,如文档中所示:使用默认密码编码器()
不幸的是,我还没有找到一个替代方法,来完成这个教程,而不使用被弃用的方法。如果可能的话,有人能提供一个替代方法吗?
谢谢你!

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

ar7v8xwq

ar7v8xwq1#

编辑:删除了旧答案,误解了问题。下面是新答案:

User.withDefaultPasswordEncoder()仍然可以用于演示,您不必担心这是否是您正在做的事情-即使它已被弃用-但在生产中,您不应该在源代码中使用纯文本密码。
您应该执行following:而不是使用当前的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();
}

其中ENCODED_PASSWORD是用BCrypt编码的secret123。你也可以用编程的方式编码,如下所示:passwordEncoder().encode("secret123") .
这样,即使您将代码推送到公共存储库,人们也不会知道密码,因为ENCODED_PASSWORD只显示编码后的(和散列)版本的密码,而不是纯文本版本的密码,但因为您知道$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2实际上是字符串secret123的编码密码,而其他密码则不知道,具有凭据user:secret123的内存中用户将不会受到威胁。
请注意,为了便于示例,我使用了将其保留在静态变量中。

h5qlskok

h5qlskok2#

使用passwordEncoder.encode()的过程如下

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

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

}
inkz8wg9

inkz8wg93#

在Spring Security 5.7.3中,WebSecurityConfigurerAdapter将被弃用,取而代之的是,我们必须提供UserDetailsService接口的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();
    }

}

相关问题