46
46
import org .springframework .security .core .userdetails .User ;
47
47
import org .springframework .security .core .userdetails .UserCache ;
48
48
import org .springframework .security .core .userdetails .UserDetails ;
49
+ import org .springframework .security .core .userdetails .UserDetailsPasswordService ;
49
50
import org .springframework .security .core .userdetails .cache .NullUserCache ;
50
51
import org .springframework .security .core .userdetails .jdbc .JdbcDaoImpl ;
51
52
import org .springframework .util .Assert ;
65
66
* @author Luke Taylor
66
67
* @since 2.0
67
68
*/
68
- public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsManager , GroupManager {
69
+ public class JdbcUserDetailsManager extends JdbcDaoImpl
70
+ implements UserDetailsManager , GroupManager , UserDetailsPasswordService {
69
71
70
72
public static final String DEF_CREATE_USER_SQL = "insert into users (username, password, enabled) values (?,?,?)" ;
71
73
@@ -162,6 +164,8 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
162
164
163
165
private RowMapper <GrantedAuthority > grantedAuthorityMapper = this ::mapToGrantedAuthority ;
164
166
167
+ private boolean enableUpdatePassword = false ;
168
+
165
169
public JdbcUserDetailsManager () {
166
170
}
167
171
@@ -591,6 +595,20 @@ public void setUserCache(UserCache userCache) {
591
595
this .userCache = userCache ;
592
596
}
593
597
598
+ /**
599
+ * Sets whether the {@link #updatePassword(UserDetails, String)} method should
600
+ * actually update the password.
601
+ * <p>
602
+ * Defaults to {@code false} to prevent accidental password updates that might produce
603
+ * passwords that are too large for the current database schema. Users must explicitly
604
+ * set this to {@code true} to enable password updates.
605
+ * @param enableUpdatePassword {@code true} to enable password updates, {@code false}
606
+ * otherwise.
607
+ */
608
+ public void setEnableUpdatePassword (boolean enableUpdatePassword ) {
609
+ this .enableUpdatePassword = enableUpdatePassword ;
610
+ }
611
+
594
612
private void validateUserDetails (UserDetails user ) {
595
613
Assert .hasText (user .getUsername (), "Username may not be empty or null" );
596
614
validateAuthorities (user .getAuthorities ());
@@ -604,4 +622,14 @@ private void validateAuthorities(Collection<? extends GrantedAuthority> authorit
604
622
}
605
623
}
606
624
625
+ @ Override
626
+ public UserDetails updatePassword (UserDetails user , String newPassword ) {
627
+ if (this .enableUpdatePassword ) {
628
+ UserDetails updated = User .withUserDetails (user ).password (newPassword ).build ();
629
+ updateUser (updated );
630
+ return updated ;
631
+ }
632
+ return user ;
633
+ }
634
+
607
635
}
0 commit comments