【发布时间】:2021-01-21 00:19:18
【问题描述】:
使用 Spring Boot CLI 可以执行以下操作:
spring encodepassword secret
该命令的打印位置
{bcrypt}$2a$10$ZjFpLGhApSqM1ftCBOPvt.3aV3l5dsRawW61ZCX2lbIqRq6afgzk6
因此密码secret被编码为{bcrypt}$2a$10$ZjFpLGhApSqM1ftCBOPvt.3aV3l5dsRawW61ZCX2lbIqRq6afgzk6,观察$2a$10和{bcrypt}部分
已声明:
@Bean
PasswordEncoder encoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
是否必须使用以下内容:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("some_user")
.password("{bcrypt}$2a$10$ZjFpLGhApSqM1ftCBOPvt.3aV3l5dsRawW61ZCX2lbIqRq6afgzk6")
.authorities("ROLE_SOME_ROLE");
观察是强制使用{bcrypt},更多细节在PasswordEncoderFactories类(对于createDelegatingPasswordEncoder方法),因为DelegatingPasswordEncoder类在幕后使用。
如果我不使用
@Bean
PasswordEncoder encoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
并且仅替换为:
@Bean
PasswordEncoder bcryptEncoder() {
return new BCryptPasswordEncoder(BCryptVersion.$2A, 10);// or new BCryptPasswordEncoder()
}
观察:从上方
-
BCryptPasswordEncoder(BCryptVersion.$2A, 10)或new BCryptPasswordEncoder()几乎相同,请参阅BCryptPasswordEncoder 类更多详细信息 - 观察
$2A, 10部分,它与$2a$10(来自密码)匹配。
现在是强制使用:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("some_user")
.password("$2a$10$ZjFpLGhApSqM1ftCBOPvt.3aV3l5dsRawW61ZCX2lbIqRq6afgzk6")
.authorities("ROLE_SOME_ROLE");
观察是强制性的不使用{bcrypt},这是因为DelegatingPasswordEncoder 类不再在幕后使用。否则无法登录。
直到这里都有意义
现在混乱如下:
如果使用:
@Bean
PasswordEncoder bcryptEncoder() {
return new BCryptPasswordEncoder(BCryptVersion.$2Y, 12);
}
观察:现在使用$2Y, 12,它与$2A, 10 完全不同(因此也不同于$2a$10 密码部分/部分)。
情况
还可以进行登录过程。我认为这一定是不可能的,因为模式不一样。顺便说一句,我确实在项目中做了clean compile。
那么发生了什么?
【问题讨论】:
标签: java spring-security bcrypt