-
Notifications
You must be signed in to change notification settings - Fork 6.3k
Refactor: Improve logic rigor for upgradeEncoding in DaoAuthenticationProvider.createSuccessAuthentication #18781
Copy link
Copy link
Closed
Labels
status: waiting-for-triageAn issue we've not yet triagedAn issue we've not yet triagedtype: bugA general bugA general bug
Description
in spring security core 7.0.3 class DaoAuthenticationProvider method createSuccessAuthentication upgradeEncoding logic,default condition will be always true,some body will not want to updatePassword。
public DaoAuthenticationProvider(UserDetailsService userDetailsService) {
this.userDetailsPasswordService = UserDetailsPasswordService.NOOP;
Assert.notNull(userDetailsService, "userDetailsService cannot be null");
this.userDetailsService = userDetailsService;
}
......
protected Authentication createSuccessAuthentication(Object principal, Authentication authentication, UserDetails user) {
Assert.notNull(authentication.getCredentials(), "Authentication.getCredentials() cannot be null");
String presentedPassword = authentication.getCredentials().toString();
boolean isPasswordCompromised = this.compromisedPasswordChecker != null && this.compromisedPasswordChecker.check(presentedPassword).isCompromised();
if (isPasswordCompromised) {
throw new CompromisedPasswordException("The provided password is compromised, please change your password");
} else {
String existingEncodedPassword = user.getPassword();
boolean upgradeEncoding = existingEncodedPassword != null && this.userDetailsPasswordService != null && ((PasswordEncoder)this.passwordEncoder.get()).upgradeEncoding(existingEncodedPassword);
if (upgradeEncoding) {
String newPassword = ((PasswordEncoder)this.passwordEncoder.get()).encode(presentedPassword);
user = this.userDetailsPasswordService.updatePassword(user, newPassword);
}
return super.createSuccessAuthentication(principal, authentication, user);
}
}
boolean upgradeEncoding = existingEncodedPassword != null && this.userDetailsPasswordService != null && ((PasswordEncoder)this.passwordEncoder.get()).upgradeEncoding(existingEncodedPassword);
default upgradeEncoding will be always true?
Improvement:
boolean upgradeEncoding = existingEncodedPassword != null && !Objects.equals(this.userDetailsPasswordService,UserDetailsPasswordService.NOOP) && ((PasswordEncoder)this.passwordEncoder.get()).upgradeEncoding(existingEncodedPassword);
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
status: waiting-for-triageAn issue we've not yet triagedAn issue we've not yet triagedtype: bugA general bugA general bug