Skip to content

Commit dcfe588

Browse files
committed
Add Jackson 3 TestingAuthenticationToken Support
Without this many of the tests fail when using Jackson 3
1 parent e738759 commit dcfe588

File tree

3 files changed

+93
-12
lines changed

3 files changed

+93
-12
lines changed

core/src/main/java/org/springframework/security/jackson/CoreJacksonModule.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ public void setupModule(SetupContext context) {
107107
context.setMixIn(FactorGrantedAuthority.class, FactorGrantedAuthorityMixin.class);
108108
context.setMixIn(User.class, UserMixin.class);
109109
context.setMixIn(UsernamePasswordAuthenticationToken.class, UsernamePasswordAuthenticationTokenMixin.class);
110+
context.setMixIn(TestingAuthenticationToken.class, TestingAuthenticationTokenMixin.class);
110111
context.setMixIn(BadCredentialsException.class, BadCredentialsExceptionMixin.class);
111112
}
112113

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,36 +14,44 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.security.oauth2.server.authorization.jackson;
17+
package org.springframework.security.jackson;
1818

19-
import java.util.List;
19+
import java.util.Collection;
2020

2121
import com.fasterxml.jackson.annotation.JsonAutoDetect;
2222
import com.fasterxml.jackson.annotation.JsonCreator;
23-
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
2423
import com.fasterxml.jackson.annotation.JsonProperty;
2524
import com.fasterxml.jackson.annotation.JsonTypeInfo;
2625

27-
import org.springframework.security.authentication.TestingAuthenticationToken;
2826
import org.springframework.security.core.GrantedAuthority;
2927

3028
/**
31-
* This mixin class is used to serialize/deserialize {@link TestingAuthenticationToken}.
29+
* This is a Jackson mixin class helps in serialize/deserialize
30+
* {@link org.springframework.security.authentication.AnonymousAuthenticationToken} class.
3231
*
33-
* @author Steve Riesenberg
32+
* @author Sebastien Deleuze
33+
* @author Jitendra Singh
3434
* @since 7.0
35-
* @see TestingAuthenticationToken
35+
* @see CoreJacksonModule
36+
* @see SecurityJacksonModules
3637
*/
3738
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
38-
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE,
39-
isGetterVisibility = JsonAutoDetect.Visibility.NONE)
40-
@JsonIgnoreProperties(value = { "authenticated" }, ignoreUnknown = true)
41-
public class TestingAuthenticationTokenMixin {
39+
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, isGetterVisibility = JsonAutoDetect.Visibility.NONE,
40+
getterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.ANY)
41+
class TestingAuthenticationTokenMixin {
4242

43+
/**
44+
* Constructor used by Jackson to create object of
45+
* {@link org.springframework.security.authentication.AnonymousAuthenticationToken}.
46+
* {@link org.springframework.security.authentication.AnonymousAuthenticationToken#AnonymousAuthenticationToken(String, Object, Collection)}
47+
* @param principal the principal (typically a <code>UserDetails</code>)
48+
* @param credentials the credentials
49+
* @param authorities the authorities granted to the principal
50+
*/
4351
@JsonCreator
4452
TestingAuthenticationTokenMixin(@JsonProperty("principal") Object principal,
4553
@JsonProperty("credentials") Object credentials,
46-
@JsonProperty("authorities") List<GrantedAuthority> authorities) {
54+
@JsonProperty("authorities") Collection<? extends GrantedAuthority> authorities) {
4755
}
4856

4957
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* Copyright 2004-present the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.security.jackson;
18+
19+
import org.junit.jupiter.api.Test;
20+
import org.skyscreamer.jsonassert.JSONAssert;
21+
22+
import org.springframework.security.authentication.TestingAuthenticationToken;
23+
24+
import static org.assertj.core.api.Assertions.assertThat;
25+
26+
/**
27+
* Tests {@link TestingAuthenticationTokenMixin}.
28+
*
29+
* @author Rob Winch
30+
* @since 7.0
31+
*/
32+
class TestingAuthenticationTokenMixinTests extends AbstractMixinTests {
33+
34+
private static final String EXPECTED_JSON = """
35+
{
36+
"@class": "org.springframework.security.authentication.TestingAuthenticationToken",
37+
"authorities": [
38+
"java.util.Collections$UnmodifiableRandomAccessList",
39+
[
40+
{
41+
"@class": "org.springframework.security.core.authority.SimpleGrantedAuthority",
42+
"authority": "ROLE_A"
43+
},
44+
{
45+
"@class": "org.springframework.security.core.authority.SimpleGrantedAuthority",
46+
"authority": "ROLE_B"
47+
}
48+
]
49+
],
50+
"details": null,
51+
"authenticated": true,
52+
"credentials": null,
53+
"principal": "principal"
54+
}""";
55+
56+
private TestingAuthenticationToken expectedToken = new TestingAuthenticationToken("principal", null, "ROLE_A",
57+
"ROLE_B");
58+
59+
@Test
60+
void serialize() throws Exception {
61+
String json = this.mapper.writeValueAsString(this.expectedToken);
62+
JSONAssert.assertEquals(EXPECTED_JSON, json, true);
63+
}
64+
65+
@Test
66+
void deserialize() {
67+
TestingAuthenticationToken actual = (TestingAuthenticationToken) this.mapper.readValue(EXPECTED_JSON,
68+
Object.class);
69+
assertThat(actual).isEqualTo(this.expectedToken);
70+
}
71+
72+
}

0 commit comments

Comments
 (0)