Skip to content

Commit df613ed

Browse files
author
Rob Winch
committed
JSON UserDetails deserializes null
JSON UserDetails null use to be treated as "". This changes null to be treated as a null Issue gh-3736
1 parent 3fb77f3 commit df613ed

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

cas/src/test/java/org/springframework/security/cas/jackson2/CasAuthenticationTokenMixinTests.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616

1717
package org.springframework.security.cas.jackson2;
1818

19+
import java.io.IOException;
20+
import java.util.Collection;
21+
import java.util.Collections;
22+
import java.util.Date;
23+
1924
import com.fasterxml.jackson.core.JsonProcessingException;
2025
import com.fasterxml.jackson.databind.ObjectMapper;
2126
import org.jasig.cas.client.authentication.AttributePrincipalImpl;
@@ -26,17 +31,14 @@
2631
import org.junit.runner.RunWith;
2732
import org.mockito.runners.MockitoJUnitRunner;
2833
import org.skyscreamer.jsonassert.JSONAssert;
34+
2935
import org.springframework.security.cas.authentication.CasAuthenticationToken;
3036
import org.springframework.security.core.GrantedAuthority;
3137
import org.springframework.security.core.authority.SimpleGrantedAuthority;
3238
import org.springframework.security.core.userdetails.User;
39+
import org.springframework.security.core.userdetails.UserDetails;
3340
import org.springframework.security.jackson2.SecurityJacksonModules;
3441

35-
import java.io.IOException;
36-
import java.util.Collection;
37-
import java.util.Collections;
38-
import java.util.Date;
39-
4042
import static org.assertj.core.api.Assertions.assertThat;
4143

4244
/**
@@ -92,6 +94,12 @@ public void serializeCasAuthenticationTestAfterEraseCredentialInvoked() throws J
9294
JSONAssert.assertEquals(String.format(expectedJson, "null"), actualJson, true);
9395
}
9496

97+
@Test
98+
public void deserializeCasAuthenticationTestAfterEraseCredentialInvoked() throws Exception {
99+
CasAuthenticationToken token = buildObjectMapper().readValue(String.format(expectedJson, "null"), CasAuthenticationToken.class);
100+
assertThat(((UserDetails)token.getPrincipal()).getPassword()).isNull();
101+
}
102+
95103
@Test
96104
public void deserializeCasAuthenticationTest() throws IOException, JSONException {
97105
CasAuthenticationToken token = buildObjectMapper().readValue(String.format(expectedJson, "\"" + PASSWORD + "\""), CasAuthenticationToken.class);

core/src/main/java/org/springframework/security/jackson2/UserDeserializer.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,18 @@ public User deserialize(JsonParser jp, DeserializationContext ctxt) throws IOExc
5858
JsonNode jsonNode = mapper.readTree(jp);
5959
Set<GrantedAuthority> authorities = mapper.convertValue(jsonNode.get("authorities"), new TypeReference<Set<SimpleGrantedAuthority>>() {
6060
});
61-
return new User(
62-
readJsonNode(jsonNode, "username").asText(), readJsonNode(jsonNode, "password").asText(""),
61+
JsonNode password = readJsonNode(jsonNode, "password");
62+
User result = new User(
63+
readJsonNode(jsonNode, "username").asText(), password.asText(""),
6364
readJsonNode(jsonNode, "enabled").asBoolean(), readJsonNode(jsonNode, "accountNonExpired").asBoolean(),
6465
readJsonNode(jsonNode, "credentialsNonExpired").asBoolean(),
6566
readJsonNode(jsonNode, "accountNonLocked").asBoolean(), authorities
6667
);
68+
69+
if(password.asText(null) == null) {
70+
result.eraseCredentials();
71+
}
72+
return result;
6773
}
6874

6975
private JsonNode readJsonNode(JsonNode jsonNode, String field) {

core/src/test/java/org/springframework/security/jackson2/UserDeserializerTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ public void deserializeUserWithNullPasswordNoAuthorityTest() throws IOException
8080
User user = mapper.readValue(userJsonWithoutPasswordString, User.class);
8181
assertThat(user).isNotNull();
8282
assertThat(user.getUsername()).isEqualTo("admin");
83-
assertThat(user.getPassword()).isEqualTo("");
84-
assertThat(user.getAuthorities()).hasSize(0);
83+
assertThat(user.getPassword()).isNull();
84+
assertThat(user.getAuthorities()).isEmpty();
8585
assertThat(user.isEnabled()).isEqualTo(true);
8686
}
8787

0 commit comments

Comments
 (0)