Skip to content

Commit ad0d3e9

Browse files
committed
Polish remember me username check
1 parent 26ae590 commit ad0d3e9

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

web/src/main/java/org/springframework/security/web/authentication/rememberme/TokenBasedRememberMeServices.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.security.crypto.codec.Hex;
2222
import org.springframework.security.core.userdetails.UserDetails;
2323
import org.springframework.security.crypto.codec.Utf8;
24+
import org.springframework.util.Assert;
2425
import org.springframework.util.StringUtils;
2526

2627
import javax.servlet.http.HttpServletRequest;
@@ -123,10 +124,9 @@ protected UserDetails processAutoLoginCookie(String[] cookieTokens,
123124
UserDetails userDetails = getUserDetailsService().loadUserByUsername(
124125
cookieTokens[0]);
125126

126-
if (userDetails == null) {
127-
throw new InvalidCookieException("Cookie token[0] contained username '"
128-
+ cookieTokens[0] + "' that does not exist.");
129-
}
127+
Assert.notNull(userDetails, () -> "UserDetailsService " + getUserDetailsService()
128+
+ " returned null for username " + cookieTokens[0] + ". "
129+
+ "This is an interface contract violation");
130130

131131
// Check signature of token matches remaining details.
132132
// Must do this after user lookup, as we need the DAO-derived password.

web/src/test/java/org/springframework/security/web/authentication/rememberme/TokenBasedRememberMeServicesTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ void udsWillThrowNotFound() {
6969
new UsernameNotFoundException(""));
7070
}
7171

72+
void udsWillReturnNull() {
73+
when(uds.loadUserByUsername(any(String.class))).thenReturn(null);
74+
}
75+
7276
private long determineExpiryTimeFromBased64EncodedToken(String validToken) {
7377
String cookieAsPlainText = new String(Base64.decodeBase64(validToken.getBytes()));
7478
String[] cookieTokens = StringUtils.delimitedListToStringArray(cookieAsPlainText,
@@ -230,6 +234,21 @@ public void autoLoginClearsCookieIfUserNotFound() throws Exception {
230234
assertThat(returnedCookie.getMaxAge()).isZero();
231235
}
232236

237+
@Test(expected = IllegalArgumentException.class)
238+
public void autoLoginClearsCookieIfUserServiceMisconfigured() {
239+
udsWillReturnNull();
240+
Cookie cookie = new Cookie(SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY,
241+
generateCorrectCookieContentForToken(
242+
System.currentTimeMillis() + 1000000, "someone", "password",
243+
"key"));
244+
MockHttpServletRequest request = new MockHttpServletRequest();
245+
request.setCookies(cookie);
246+
247+
MockHttpServletResponse response = new MockHttpServletResponse();
248+
249+
services.autoLogin(request, response);
250+
}
251+
233252
@Test
234253
public void autoLoginWithValidTokenAndUserSucceeds() throws Exception {
235254
udsWillReturnUser();

0 commit comments

Comments
 (0)