Browse Source

Add the BadCredentialsExceptionMixin to help Jackson serialization of BadCredentialsException

ylombardi 7 years ago
parent
commit
1d0e97880d

+ 52 - 0
core/src/main/java/org/springframework/security/jackson2/BadCredentialsExceptionMixin.java

@@ -0,0 +1,52 @@
+/*
+ * Copyright 2002-2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.security.jackson2;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
+/**
+ * This mixin class helps in serialize/deserialize
+ * {@link org.springframework.security.authentication.BadCredentialsException} class. To use this class you need to
+ * register it with {@link com.fasterxml.jackson.databind.ObjectMapper}.
+ *
+ * <pre>
+ *     ObjectMapper mapper = new ObjectMapper();
+ *     mapper.registerModule(new CoreJackson2Module());
+ * </pre>
+ *
+ * <i>Note: This class will save TypeInfo (full class name) into a property called @class</i>
+ * <i>The cause and stackTrace are ignored in the serialization.</i>
+ *
+ * @author Yannick Lombardi
+ * @see CoreJackson2Module
+ * @since 5.0
+ */
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY)
+@JsonIgnoreProperties(ignoreUnknown = true, value = {"cause", "stackTrace"})
+class BadCredentialsExceptionMixin {
+
+	/**
+	 * Constructor used by Jackson to create
+	 * {@link org.springframework.security.authentication.BadCredentialsException} object.
+	 *
+	 * @param message the detail message
+	 */
+	@JsonCreator
+	BadCredentialsExceptionMixin(@JsonProperty("message") String message) {}
+}

+ 2 - 0
core/src/main/java/org/springframework/security/jackson2/CoreJackson2Module.java

@@ -20,6 +20,7 @@ import com.fasterxml.jackson.core.Version;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.module.SimpleModule;
 import org.springframework.security.authentication.AnonymousAuthenticationToken;
+import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.RememberMeAuthenticationToken;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -61,5 +62,6 @@ public class CoreJackson2Module extends SimpleModule {
 		context.setMixInAnnotations(Collections.<Object>unmodifiableList(Collections.emptyList()).getClass(), UnmodifiableListMixin.class);
 		context.setMixInAnnotations(User.class, UserMixin.class);
 		context.setMixInAnnotations(UsernamePasswordAuthenticationToken.class, UsernamePasswordAuthenticationTokenMixin.class);
+		context.setMixInAnnotations(BadCredentialsException.class, BadCredentialsExceptionMixin.class);
 	}
 }

+ 58 - 0
core/src/test/java/org/springframework/security/jackson2/BadCredentialsExceptionMixinTests.java

@@ -0,0 +1,58 @@
+/*
+ * Copyright 2002-2018 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springframework.security.jackson2;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import org.json.JSONException;
+import org.junit.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.springframework.security.authentication.BadCredentialsException;
+
+import java.io.IOException;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * @author Yannick Lombardi
+ * @since 5.0
+ */
+public class BadCredentialsExceptionMixinTests extends AbstractMixinTests {
+
+	// @formatter:off
+	private static final String EXCEPTION_JSON = "{"
+		+ "\"@class\": \"org.springframework.security.authentication.BadCredentialsException\","
+		+ "\"localizedMessage\": \"message\", "
+		+ "\"message\": \"message\", "
+		+ "\"suppressed\": [\"[Ljava.lang.Throwable;\",[]]"
+		+ "}";
+	// @formatter:on
+
+	@Test
+	public void serializeBadCredentialsExceptionMixinTest() throws JsonProcessingException, JSONException {
+		BadCredentialsException exception = new BadCredentialsException("message");
+		String serializedJson = mapper.writeValueAsString(exception);
+		JSONAssert.assertEquals(EXCEPTION_JSON, serializedJson, true);
+	}
+
+	@Test
+	public void deserializeBadCredentialsExceptionMixinTest() throws IOException {
+		BadCredentialsException exception = mapper.readValue(EXCEPTION_JSON, BadCredentialsException.class);
+		assertThat(exception).isNotNull();
+		assertThat(exception.getCause()).isNull();
+		assertThat(exception.getMessage()).isEqualTo("message");
+		assertThat(exception.getLocalizedMessage()).isEqualTo("message");
+	}
+}