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_PASSWORD
是secret123
用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源码+数据库设计