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

Posted

技术标签:

【中文标题】Java Spring Security - User.withDefaultPasswordEncoder() 已弃用?【英文标题】:Java Spring Security - User.withDefaultPasswordEncoder() is deprecated? 【发布时间】:2018-09-25 15:09:02 【问题描述】:

我对 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(),如文档中所示,现在已弃用:withDefaultPasswordEncoder()

不幸的是,我无法找到替代方法来完成本教程而不使用已弃用的方法。 如果可能的话,有人可以为此提供替代方案吗?

谢谢!

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

【问题讨论】:

您是否阅读了整个 Javadoc?它涉及大量细节,特别是包括“对于演示和入门是可以接受的” 我做到了,但是在实现这个(不只是拉回购)时,当我编写方法时,我不断收到错误消息,说 withDefaultPasswordEncoder() 无法解析,并且不会让我运行程序 已弃用(您会收到警告)和未解决之间存在差异,这是一个错误。该文档仍在 5.0 文档中,因此不应消失;您使用的是什么版本的 Spring Security 依赖项? 使用我认为是 5.0.4.RELEASE 的 gradle ..... -> compile("org.springframework.boot:spring-boot-starter-security") Spring Boot 1.5 还是 2.0? 【参考方案1】:

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

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

您应该做的而不是使用当前的userDetailsService() 方法是following:

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_PASSWORDsecret123 用BCrypt 编码的。您也可以像这样以编程方式对其进行编码:passwordEncoder().encode("secret123")

这样,即使您将代码推送到公共存储库,人们也不会知道密码,因为ENCODED_PASSWORD 只显示密码的编码版本而不是纯文本版本,而是因为您知道@987654329 @ 实际上是字符串 secret123 的编码密码,而其他人则不是,您的具有凭据 user:secret123 的内存用户不会被泄露。

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

【讨论】:

您好,请对passwordEncoder().encode("secret123") 建议提出一个简短的问题。您说这样,即使您将代码推送到公共存储库,人们也不会知道密码,因为 ENCODED_PASSWORD 只显示密码的编码版本而不是纯文本版本,我是困惑,如果我使用passwordEncoder().encode("secret123") 并将其上传到存储库,人们不会看到我的密码吗?而如果我坚持使用 ENCODED_PASSWORD 变量的原始代码,那么人们将看不到我的原始密码。我对你所说的 That way,...thanx 的意思感到困惑 @Scaramouche 将密码推送到公共存储库绝不是一个好主意,无论它是否经过编码/散列,但关键是,如果你,而不是在你的代码中写 passwordEncoder().encode("secret123") ,您推送了$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2,人们不会自动知道您的密码是secret123,因为您只是推送了哈希值——而不是实际密码。我试图说明的一点是,您可以在本地运行 System.out.println(passwordEncoder().encode("secret123")),复制结果并将该结果用作密码 ... 在您的代码中。但是再一次记住,我的意思是,如果你想隐藏密码,推送$2a$10$AIUufK8g6EFhBcumRRV2L.AQNz3Bjp7oDQVFiO5JJMBFZQ6x2/R/2 比推送passwordEncoder().encode("secret123") 安全得多,但在未来,当有更好更快的计算机时,您的密码很可能被泄露。最好避免在公共存储库上推送任何密码/机密信息。相反,您应该使用环境变量。 @Twin 如何处理成功的身份验证?例如,我需要生成一个 GWT 令牌并将其作为新的 Header 返回并添加到 HTTP 请求中。有可能吗? @TwiN 我遵循了你的方法。但是,在提供用户名作为“用户”和密码作为“secret123”时,我不断收到“错误凭据”消息。你能帮忙解释一下为什么会出现这个错误吗?【参考方案2】:

使用 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();
    


【讨论】:

以上是关于Java Spring Security - User.withDefaultPasswordEncoder() 已弃用?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security Java Config Preview--官方

java.security.Principal - 在 HttpServletRequest 和 Spring Security 中创建

Spring- Security :java.lang.NoClassDefFoundError: org/springframework/security/context/DelegatingApp

spring security 登陆报错java.lang.StackOverflowError: null?

如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java config

spring security4.2.2的maven配置+spring-security配置详解+java源码+数据库设计