16
16
17
17
package org .springframework .security .provisioning ;
18
18
19
+ import java .util .Collection ;
19
20
import java .util .Properties ;
20
21
21
22
import org .junit .jupiter .api .Test ;
22
23
23
24
import org .springframework .security .authentication .TestAuthentication ;
24
25
import org .springframework .security .core .Authentication ;
26
+ import org .springframework .security .core .CredentialsContainer ;
27
+ import org .springframework .security .core .GrantedAuthority ;
25
28
import org .springframework .security .core .context .SecurityContextHolderStrategy ;
26
29
import org .springframework .security .core .context .SecurityContextImpl ;
27
30
import org .springframework .security .core .userdetails .PasswordEncodedUser ;
@@ -105,6 +108,20 @@ public void createUserWhenUserAlreadyExistsThenException() {
105
108
.withMessage ("user should not exist" );
106
109
}
107
110
111
+ @ Test
112
+ public void createUserWhenInstanceOfMutableUserDetailsThenChangePasswordWorks () {
113
+ InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager ();
114
+ CustomUser user = new CustomUser (User .withUserDetails (PasswordEncodedUser .user ()).build ());
115
+ Authentication authentication = TestAuthentication .authenticated (user );
116
+ SecurityContextHolderStrategy strategy = mock (SecurityContextHolderStrategy .class );
117
+ given (strategy .getContext ()).willReturn (new SecurityContextImpl (authentication ));
118
+ manager .setSecurityContextHolderStrategy (strategy );
119
+ manager .createUser (user );
120
+ String newPassword = "newPassword" ;
121
+ manager .changePassword (user .getPassword (), newPassword );
122
+ assertThat (manager .loadUserByUsername (user .getUsername ()).getPassword ()).isEqualTo (newPassword );
123
+ }
124
+
108
125
@ Test
109
126
public void updateUserWhenUserDoesNotExistThenException () {
110
127
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager ();
@@ -119,4 +136,57 @@ public void loadUserByUsernameWhenUserNullThenException() {
119
136
.isThrownBy (() -> manager .loadUserByUsername (this .user .getUsername ()));
120
137
}
121
138
139
+ @ Test
140
+ public void loadUserByUsernameWhenNotInstanceOfCredentialsContainerThenReturnInstanceOfCredentialsContainer () {
141
+ MutableUser user = new MutableUser (User .withUserDetails (PasswordEncodedUser .user ()).build ());
142
+ InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager (user );
143
+ assertThat (user ).isNotInstanceOf (CredentialsContainer .class );
144
+ assertThat (manager .loadUserByUsername (user .getUsername ())).isInstanceOf (CredentialsContainer .class );
145
+ }
146
+
147
+ @ Test
148
+ public void loadUserByUsernameWhenInstanceOfCredentialsContainerThenReturnInstance () {
149
+ CustomUser user = new CustomUser (User .withUserDetails (PasswordEncodedUser .user ()).build ());
150
+ InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager (user );
151
+ assertThat (manager .loadUserByUsername (user .getUsername ())).isSameAs (user );
152
+ }
153
+
154
+ static class CustomUser implements MutableUserDetails , CredentialsContainer {
155
+
156
+ private final UserDetails delegate ;
157
+
158
+ private String password ;
159
+
160
+ CustomUser (UserDetails user ) {
161
+ this .delegate = user ;
162
+ this .password = user .getPassword ();
163
+ }
164
+
165
+ @ Override
166
+ public Collection <? extends GrantedAuthority > getAuthorities () {
167
+ return this .delegate .getAuthorities ();
168
+ }
169
+
170
+ @ Override
171
+ public String getPassword () {
172
+ return this .password ;
173
+ }
174
+
175
+ @ Override
176
+ public void setPassword (final String password ) {
177
+ this .password = password ;
178
+ }
179
+
180
+ @ Override
181
+ public String getUsername () {
182
+ return this .delegate .getUsername ();
183
+ }
184
+
185
+ @ Override
186
+ public void eraseCredentials () {
187
+ this .password = null ;
188
+ }
189
+
190
+ }
191
+
122
192
}
0 commit comments