我有一个REST Sping Boot 2应用程序,我正在尝试实现一个安全机制,它可以接受带有原始密码和加密密码的登录请求。
对于原始密码,应用程序工作正常。我可以创建用户,将他们的加密密码存储在数据库中,并在他们发送原始密码时对他们进行身份验证。
问题是,在某些情况下,我们的客户端服务具有预配置的用户,这些用户具有已经加密的密码,他们需要发送此加密密码进行身份验证。
我目前的配置如下:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService userDetailsService;
@Autowired
private AuthEntryPointJwt unauthorizedHandler;
@Bean
public AuthTokenFilter authenticationJwtTokenFilter() {
return new AuthTokenFilter();
}
@Override
public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
authenticationManagerBuilder.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new PasswordEncoder() {
final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10, new SecureRandom());
@Override public String encode(CharSequence rawPassword) {
return encoder.encode(rawPassword);
}
@Override public boolean matches(CharSequence rawPassword, String encodedPassword) {
return encoder.matches(rawPassword, encodedPassword);
}
};
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors()
.and()
.csrf()
.disable()
.exceptionHandling()
.authenticationEntryPoint(unauthorizedHandler)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.anyRequest()
.authenticated();
http.headers()
.frameOptions()
.sameOrigin();
http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
}
是否有办法绕过PasswordEncoder?因为在某些情况下,已经有一个加密的密码,也许我们所需要的只是将它与现有的存储加密密码进行比较。
另外,这会是一个反模式吗?任何提示都很感激。
2条答案
按热度按时间iklwldmw1#
如果你不知道密码是否被编码,你可以尝试这样做,但它需要用相同的算法进行哈希。
更新文档:
**布尔值匹配(java.lang.字符序列rawPassword、
java.lang.字符串编码密码)**
验证从存储中获取的编码密码与提交的原始密码是否匹配。如果密码匹配,则返回true;如果不匹配,则返回false。存储的密码本身永远不会解码。
参数:
rawPassword -要编码和匹配的原始密码
encodedPassword -要与之比较的存储中的编码密码
退货:
如果原始密码在编码后与存储中的编码密码匹配,则为true
ktecyv1j2#
您可以创建一个密码编码器的noop实现:
要处理编码/原始密码,您可以实现自己的密码:
您可以在其中基于某种头来实现您的逻辑?您可以在SpringSecurity配置中使用它