Skip to content

Commit 8d412d2

Browse files
jaminhgregturn
authored andcommitted
SWS-972 - Handle UserDetailsService not finding user
SpringSecurityPasswordValidationCallbackHandler throws NPE when UserDetailsService does not find user. This adds a null check and additional test cases.
1 parent eaa5bba commit 8d412d2

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

spring-ws-security/src/main/java/org/springframework/ws/soap/security/wss4j2/callback/SpringSecurityPasswordValidationCallbackHandler.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.security.core.userdetails.cache.NullUserCache;
3434
import org.springframework.util.Assert;
3535
import org.springframework.ws.soap.security.callback.CleanupCallback;
36+
import org.springframework.ws.soap.security.support.SpringSecurityUtils;
3637

3738
/**
3839
* Callback handler that validates a plain text or digest password using an Spring Security {@code UserDetailsService}.
@@ -76,8 +77,11 @@ public void afterPropertiesSet() throws Exception {
7677
* <p>Default implementation throws an {@link UnsupportedCallbackException}.
7778
*/
7879
protected void handleUsernameToken(WSPasswordCallback callback) throws IOException, UnsupportedCallbackException {
79-
UserDetails details = loadUserDetails(callback.getIdentifier());
80-
callback.setPassword(details.getPassword());
80+
UserDetails user = loadUserDetails(callback.getIdentifier());
81+
if (user != null) {
82+
SpringSecurityUtils.checkUserValidity(user);
83+
callback.setPassword(user.getPassword());
84+
}
8185
}
8286

8387
@Override

spring-ws-security/src/test/java/org/springframework/ws/soap/security/wss4j2/callback/SpringSecurityPasswordValidationCallbackHandlerTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.springframework.security.core.userdetails.User;
2828
import org.springframework.security.core.userdetails.UserDetails;
2929
import org.springframework.security.core.userdetails.UserDetailsService;
30+
import org.springframework.security.core.userdetails.UsernameNotFoundException;
31+
import org.apache.wss4j.common.ext.WSPasswordCallback;
3032
import org.apache.wss4j.common.principal.WSUsernameTokenPrincipalImpl;
3133
import org.junit.Assert;
3234
import org.junit.Before;
@@ -42,6 +44,8 @@ public class SpringSecurityPasswordValidationCallbackHandlerTest {
4244
private SimpleGrantedAuthority grantedAuthority;
4345

4446
private UsernameTokenPrincipalCallback callback;
47+
48+
private WSPasswordCallback passwordCallback;
4549

4650
private UserDetails user;
4751

@@ -54,6 +58,38 @@ public void setUp() throws Exception {
5458

5559
WSUsernameTokenPrincipalImpl principal = new WSUsernameTokenPrincipalImpl("Ernie", true);
5660
callback = new UsernameTokenPrincipalCallback(principal);
61+
62+
passwordCallback = new WSPasswordCallback("Ernie", null, "type", WSPasswordCallback.USERNAME_TOKEN);
63+
}
64+
65+
@Test
66+
public void testHandleUsernameToken() throws Exception {
67+
UserDetailsService userDetailsService = createMock(UserDetailsService.class);
68+
callbackHandler.setUserDetailsService(userDetailsService);
69+
70+
expect(userDetailsService.loadUserByUsername("Ernie")).andReturn(user).anyTimes();
71+
72+
replay(userDetailsService);
73+
74+
callbackHandler.handleUsernameToken(passwordCallback);
75+
Assert.assertEquals("Bert", passwordCallback.getPassword());
76+
77+
verify(userDetailsService);
78+
}
79+
80+
@Test
81+
public void testHandleUsernameTokenUserNotFound() throws Exception {
82+
UserDetailsService userDetailsService = createMock(UserDetailsService.class);
83+
callbackHandler.setUserDetailsService(userDetailsService);
84+
85+
expect(userDetailsService.loadUserByUsername("Ernie")).andThrow(new UsernameNotFoundException("User 'Ernie' not found"));
86+
87+
replay(userDetailsService);
88+
89+
callbackHandler.handleUsernameToken(passwordCallback);
90+
Assert.assertNull(passwordCallback.getPassword());
91+
92+
verify(userDetailsService);
5793
}
5894

5995
@Test

0 commit comments

Comments
 (0)