Browse Source

Revert "Polish JdbcRegisteredClientRepository, JdbcOAuth2AuthorizationConsentService, JdbcOAuth2AuthorizationService"

This reverts commit e5e391db
Steve Riesenberg 4 years ago
parent
commit
473dedb9ad

+ 3 - 21
oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/JdbcOAuth2AuthorizationConsentService.java

@@ -56,7 +56,7 @@ import org.springframework.util.StringUtils;
  * @see RowMapper
  * @since 0.1.2
  */
-public class JdbcOAuth2AuthorizationConsentService implements OAuth2AuthorizationConsentService {
+public final class JdbcOAuth2AuthorizationConsentService implements OAuth2AuthorizationConsentService {
 
 	// @formatter:off
 	private static final String COLUMN_NAMES = "registered_client_id, "
@@ -169,7 +169,7 @@ public class JdbcOAuth2AuthorizationConsentService implements OAuth2Authorizatio
 	 * @param authorizationConsentRowMapper the {@link RowMapper} used for mapping the current
 	 *                                      row in {@code ResultSet} to {@link OAuth2AuthorizationConsent}
 	 */
-	public final void setAuthorizationConsentRowMapper(RowMapper<OAuth2AuthorizationConsent> authorizationConsentRowMapper) {
+	public void setAuthorizationConsentRowMapper(RowMapper<OAuth2AuthorizationConsent> authorizationConsentRowMapper) {
 		Assert.notNull(authorizationConsentRowMapper, "authorizationConsentRowMapper cannot be null");
 		this.authorizationConsentRowMapper = authorizationConsentRowMapper;
 	}
@@ -182,24 +182,12 @@ public class JdbcOAuth2AuthorizationConsentService implements OAuth2Authorizatio
 	 * @param authorizationConsentParametersMapper the {@code Function} used for mapping
 	 *                                             {@link OAuth2AuthorizationConsent} to a {@code List} of {@link SqlParameterValue}
 	 */
-	public final void setAuthorizationConsentParametersMapper(
+	public void setAuthorizationConsentParametersMapper(
 			Function<OAuth2AuthorizationConsent, List<SqlParameterValue>> authorizationConsentParametersMapper) {
 		Assert.notNull(authorizationConsentParametersMapper, "authorizationConsentParametersMapper cannot be null");
 		this.authorizationConsentParametersMapper = authorizationConsentParametersMapper;
 	}
 
-	protected final JdbcOperations getJdbcOperations() {
-		return this.jdbcOperations;
-	}
-
-	protected final RowMapper<OAuth2AuthorizationConsent> getAuthorizationConsentRowMapper() {
-		return this.authorizationConsentRowMapper;
-	}
-
-	protected final Function<OAuth2AuthorizationConsent, List<SqlParameterValue>> getAuthorizationConsentParametersMapper() {
-		return this.authorizationConsentParametersMapper;
-	}
-
 	/**
 	 * The default {@link RowMapper} that maps the current row in
 	 * {@code ResultSet} to {@link OAuth2AuthorizationConsent}.
@@ -235,11 +223,6 @@ public class JdbcOAuth2AuthorizationConsentService implements OAuth2Authorizatio
 			}
 			return builder.build();
 		}
-
-		protected final RegisteredClientRepository getRegisteredClientRepository() {
-			return this.registeredClientRepository;
-		}
-
 	}
 
 	/**
@@ -261,7 +244,6 @@ public class JdbcOAuth2AuthorizationConsentService implements OAuth2Authorizatio
 			parameters.add(new SqlParameterValue(Types.VARCHAR, StringUtils.collectionToDelimitedString(authorities, ",")));
 			return parameters;
 		}
-
 	}
 
 }

+ 3 - 2
oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/JdbcOAuth2AuthorizationService.java

@@ -29,7 +29,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.function.Function;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import org.springframework.dao.DataRetrievalFailureException;
@@ -429,9 +428,10 @@ public class JdbcOAuth2AuthorizationService implements OAuth2AuthorizationServic
 			return this.objectMapper;
 		}
 
+		@SuppressWarnings("unchecked")
 		private Map<String, Object> parseMap(String data) {
 			try {
-				return this.objectMapper.readValue(data, new TypeReference<Map<String, Object>>() {});
+				return this.objectMapper.readValue(data, Map.class);
 			} catch (Exception ex) {
 				throw new IllegalArgumentException(ex.getMessage(), ex);
 			}
@@ -527,6 +527,7 @@ public class JdbcOAuth2AuthorizationService implements OAuth2AuthorizationServic
 			return parameters;
 		}
 
+		@SuppressWarnings("unchecked")
 		private String writeMap(Map<String, Object> data) {
 			try {
 				return this.objectMapper.writeValueAsString(data);

+ 128 - 150
oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/client/JdbcRegisteredClientRepository.java

@@ -32,7 +32,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.function.Function;
 
-import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import org.springframework.jdbc.core.ArgumentPreparedStatementSetter;
@@ -95,7 +95,17 @@ public class JdbcRegisteredClientRepository implements RegisteredClientRepositor
 	 * @param jdbcOperations the JDBC operations
 	 */
 	public JdbcRegisteredClientRepository(JdbcOperations jdbcOperations) {
-		this(jdbcOperations, new DefaultLobHandler());
+		this(jdbcOperations, new ObjectMapper());
+	}
+
+	/**
+	 * Constructs a {@code JdbcRegisteredClientRepository} using the provided parameters.
+	 *
+	 * @param jdbcOperations the JDBC operations
+	 * @param objectMapper the object mapper
+	 */
+	public JdbcRegisteredClientRepository(JdbcOperations jdbcOperations, ObjectMapper objectMapper) {
+		this(jdbcOperations, new DefaultLobHandler(), objectMapper);
 	}
 
 	/**
@@ -103,16 +113,18 @@ public class JdbcRegisteredClientRepository implements RegisteredClientRepositor
 	 *
 	 * @param jdbcOperations the JDBC operations
 	 * @param lobHandler the handler for large binary fields and large text fields
+	 * @param objectMapper the object mapper
 	 */
-	public JdbcRegisteredClientRepository(JdbcOperations jdbcOperations, LobHandler lobHandler) {
+	public JdbcRegisteredClientRepository(JdbcOperations jdbcOperations, LobHandler lobHandler, ObjectMapper objectMapper) {
 		Assert.notNull(jdbcOperations, "jdbcOperations cannot be null");
 		Assert.notNull(lobHandler, "lobHandler cannot be null");
+		Assert.notNull(objectMapper, "objectMapper cannot be null");
 		this.jdbcOperations = jdbcOperations;
 		this.lobHandler = lobHandler;
-		DefaultRegisteredClientRowMapper registeredClientRowMapper = new DefaultRegisteredClientRowMapper();
+		DefaultRegisteredClientRowMapper registeredClientRowMapper = new DefaultRegisteredClientRowMapper(objectMapper);
 		registeredClientRowMapper.setLobHandler(lobHandler);
 		this.registeredClientRowMapper = registeredClientRowMapper;
-		this.registeredClientParametersMapper = new DefaultRegisteredClientParametersMapper();
+		this.registeredClientParametersMapper = new DefaultRegisteredClientParametersMapper(objectMapper);
 	}
 
 	/**
@@ -120,7 +132,7 @@ public class JdbcRegisteredClientRepository implements RegisteredClientRepositor
 	 *
 	 * @param registeredClientRowMapper mapper implementation
 	 */
-	public final void setRegisteredClientRowMapper(RowMapper<RegisteredClient> registeredClientRowMapper) {
+	public void setRegisteredClientRowMapper(RowMapper<RegisteredClient> registeredClientRowMapper) {
 		Assert.notNull(registeredClientRowMapper, "registeredClientRowMapper cannot be null");
 		this.registeredClientRowMapper = registeredClientRowMapper;
 	}
@@ -130,31 +142,15 @@ public class JdbcRegisteredClientRepository implements RegisteredClientRepositor
 	 *
 	 * @param registeredClientParametersMapper mapper implementation
 	 */
-	public final void setRegisteredClientParametersMapper(Function<RegisteredClient, List<SqlParameterValue>> registeredClientParametersMapper) {
+	public void setRegisteredClientParametersMapper(Function<RegisteredClient, List<SqlParameterValue>> registeredClientParametersMapper) {
 		Assert.notNull(registeredClientParametersMapper, "registeredClientParameterMapper cannot be null");
 		this.registeredClientParametersMapper = registeredClientParametersMapper;
 	}
 
-	protected final JdbcOperations getJdbcOperations() {
-		return this.jdbcOperations;
-	}
-
-	protected final LobHandler getLobHandler() {
-		return this.lobHandler;
-	}
-
-	protected final RowMapper<RegisteredClient> getRegisteredClientRowMapper() {
-		return this.registeredClientRowMapper;
-	}
-
-	protected final Function<RegisteredClient, List<SqlParameterValue>> getRegisteredClientParametersMapper() {
-		return this.registeredClientParametersMapper;
-	}
-
 	@Override
 	public void save(RegisteredClient registeredClient) {
 		Assert.notNull(registeredClient, "registeredClient cannot be null");
-		RegisteredClient foundClient = findBy("id = ? OR client_id = ? OR client_secret = ?",
+		RegisteredClient foundClient = this.findBy("id = ? OR client_id = ? OR client_secret = ?",
 				registeredClient.getId(), registeredClient.getClientId(),
 				registeredClient.getClientSecret().getBytes(StandardCharsets.UTF_8));
 
@@ -196,72 +192,88 @@ public class JdbcRegisteredClientRepository implements RegisteredClientRepositor
 
 	public static class DefaultRegisteredClientRowMapper implements RowMapper<RegisteredClient> {
 
-		private ObjectMapper objectMapper = new ObjectMapper();
+		private final ObjectMapper objectMapper;
+
 		private LobHandler lobHandler = new DefaultLobHandler();
 
+		public DefaultRegisteredClientRowMapper(ObjectMapper objectMapper) {
+			this.objectMapper = objectMapper;
+		}
+
+		private Set<String> parseList(String s) {
+			return s != null ? StringUtils.commaDelimitedListToSet(s) : Collections.emptySet();
+		}
+
 		@Override
+		@SuppressWarnings("unchecked")
 		public RegisteredClient mapRow(ResultSet rs, int rowNum) throws SQLException {
-			Set<String> clientScopes = parseList(rs.getString("scopes"));
-			Set<String> authorizationGrantTypes = parseList(rs.getString("authorization_grant_types"));
-			Set<String> clientAuthenticationMethods = parseList(rs.getString("client_authentication_methods"));
+			Set<String> scopes = parseList(rs.getString("scopes"));
+			Set<String> authGrantTypes = parseList(rs.getString("authorization_grant_types"));
+			Set<String> clientAuthMethods = parseList(rs.getString("client_authentication_methods"));
 			Set<String> redirectUris = parseList(rs.getString("redirect_uris"));
-			Timestamp clientIdIssuedAt = rs.getTimestamp("client_id_issued_at");
+			Timestamp clientIssuedAt = rs.getTimestamp("client_id_issued_at");
 			Timestamp clientSecretExpiresAt = rs.getTimestamp("client_secret_expires_at");
-			byte[] clientSecretValue = this.lobHandler.getBlobAsBytes(rs, "client_secret");
+			byte[] clientSecretBytes = this.lobHandler.getBlobAsBytes(rs, "client_secret");
+			String clientSecret = clientSecretBytes != null ? new String(clientSecretBytes, StandardCharsets.UTF_8) : null;
 			RegisteredClient.Builder builder = RegisteredClient
 					.withId(rs.getString("id"))
 					.clientId(rs.getString("client_id"))
-					.clientIdIssuedAt(clientIdIssuedAt != null ? clientIdIssuedAt.toInstant() : null)
-					.clientSecret(clientSecretValue != null ? new String(clientSecretValue, StandardCharsets.UTF_8) : null)
+					.clientIdIssuedAt(clientIssuedAt != null ? clientIssuedAt.toInstant() : null)
+					.clientSecret(clientSecret)
 					.clientSecretExpiresAt(clientSecretExpiresAt != null ? clientSecretExpiresAt.toInstant() : null)
 					.clientName(rs.getString("client_name"))
-					.authorizationGrantTypes((grantTypes) -> authorizationGrantTypes.forEach(authGrantType ->
-							grantTypes.add(AUTHORIZATION_GRANT_TYPE_MAP.get(authGrantType))))
-					.clientAuthenticationMethods((methods) -> clientAuthenticationMethods.forEach(clientAuthMethod ->
-							methods.add(CLIENT_AUTHENTICATION_METHOD_MAP.get(clientAuthMethod))))
-					.redirectUris((uris) -> uris.addAll(redirectUris))
-					.scopes((scopes) -> scopes.addAll(clientScopes));
-
-			RegisteredClient registeredClient = builder.build();
-
-			String tokenSettingsValue = rs.getString("token_settings");
-			if (tokenSettingsValue != null) {
-				Map<String, Object> tokenSettingsValues = parseMap(tokenSettingsValue);
-				TokenSettings tokenSettings = registeredClient.getTokenSettings();
-
-				Number accessTokenTTL = (Number) tokenSettingsValues.get("access_token_ttl");
-				if (accessTokenTTL != null) {
-					tokenSettings.accessTokenTimeToLive(Duration.ofMillis(accessTokenTTL.longValue()));
-				}
+					.authorizationGrantTypes(coll -> authGrantTypes.forEach(authGrantType ->
+							coll.add(AUTHORIZATION_GRANT_TYPE_MAP.get(authGrantType))))
+					.clientAuthenticationMethods(coll -> clientAuthMethods.forEach(clientAuthMethod ->
+							coll.add(CLIENT_AUTHENTICATION_METHOD_MAP.get(clientAuthMethod))))
+					.redirectUris(coll -> coll.addAll(redirectUris))
+					.scopes(coll -> coll.addAll(scopes));
 
-				Number refreshTokenTTL = (Number) tokenSettingsValues.get("refresh_token_ttl");
-				if (refreshTokenTTL != null) {
-					tokenSettings.refreshTokenTimeToLive(Duration.ofMillis(refreshTokenTTL.longValue()));
-				}
+			RegisteredClient rc = builder.build();
 
-				Boolean reuseRefreshTokens = (Boolean) tokenSettingsValues.get("reuse_refresh_tokens");
-				if (reuseRefreshTokens != null) {
-					tokenSettings.reuseRefreshTokens(reuseRefreshTokens);
-				}
-			}
+			TokenSettings ts = rc.getTokenSettings();
+			ClientSettings cs = rc.getClientSettings();
+
+			try {
+				String tokenSettingsJson = rs.getString("token_settings");
+				if (tokenSettingsJson != null) {
+					Map<String, Object> m = this.objectMapper.readValue(tokenSettingsJson, Map.class);
+
+					Number accessTokenTTL = (Number) m.get("access_token_ttl");
+					if (accessTokenTTL != null) {
+						ts.accessTokenTimeToLive(Duration.ofMillis(accessTokenTTL.longValue()));
+					}
 
-			String clientSettingsValue = rs.getString("client_settings");
-			if (clientSettingsValue != null) {
-				Map<String, Object> clientSettingsValues = parseMap(clientSettingsValue);
-				ClientSettings clientSettings = registeredClient.getClientSettings();
+					Number refreshTokenTTL = (Number) m.get("refresh_token_ttl");
+					if (refreshTokenTTL != null) {
+						ts.refreshTokenTimeToLive(Duration.ofMillis(refreshTokenTTL.longValue()));
+					}
 
-				Boolean requireProofKey = (Boolean) clientSettingsValues.get("require_proof_key");
-				if (requireProofKey != null) {
-					clientSettings.requireProofKey(requireProofKey);
+					Boolean reuseRefreshTokens = (Boolean) m.get("reuse_refresh_tokens");
+					if (reuseRefreshTokens != null) {
+						ts.reuseRefreshTokens(reuseRefreshTokens);
+					}
 				}
 
-				Boolean requireUserConsent = (Boolean) clientSettingsValues.get("require_user_consent");
-				if (requireUserConsent != null) {
-					clientSettings.requireUserConsent(requireUserConsent);
+				String clientSettingsJson = rs.getString("client_settings");
+				if (clientSettingsJson != null) {
+					Map<String, Object> m = this.objectMapper.readValue(clientSettingsJson, Map.class);
+
+					Boolean requireProofKey = (Boolean) m.get("require_proof_key");
+					if (requireProofKey != null) {
+						cs.requireProofKey(requireProofKey);
+					}
+
+					Boolean requireUserConsent = (Boolean) m.get("require_user_consent");
+					if (requireUserConsent != null) {
+						cs.requireUserConsent(requireUserConsent);
+					}
 				}
+			} catch (JsonProcessingException e) {
+				throw new IllegalArgumentException(e.getMessage(), e);
 			}
 
-			return registeredClient;
+			return rc;
 		}
 
 		public final void setLobHandler(LobHandler lobHandler) {
@@ -269,95 +281,61 @@ public class JdbcRegisteredClientRepository implements RegisteredClientRepositor
 			this.lobHandler = lobHandler;
 		}
 
-		public final void setObjectMapper(ObjectMapper objectMapper) {
-			Assert.notNull(objectMapper, "objectMapper cannot be null");
-			this.objectMapper = objectMapper;
-		}
-
-		protected final LobHandler getLobHandler() {
-			return this.lobHandler;
-		}
-
-		protected final ObjectMapper getObjectMapper() {
-			return this.objectMapper;
-		}
-
-		private Set<String> parseList(String s) {
-			return s != null ? StringUtils.commaDelimitedListToSet(s) : Collections.emptySet();
-		}
-
-		private Map<String, Object> parseMap(String data) {
-			try {
-				return this.objectMapper.readValue(data, new TypeReference<Map<String, Object>>() {});
-			} catch (Exception ex) {
-				throw new IllegalArgumentException(ex.getMessage(), ex);
-			}
-		}
-
 	}
 
 	public static class DefaultRegisteredClientParametersMapper implements Function<RegisteredClient, List<SqlParameterValue>> {
 
-		private ObjectMapper objectMapper = new ObjectMapper();
-
-		@Override
-		public List<SqlParameterValue> apply(RegisteredClient registeredClient) {
-			List<String> clientAuthenticationMethodNames = new ArrayList<>(registeredClient.getClientAuthenticationMethods().size());
-			for (ClientAuthenticationMethod clientAuthenticationMethod : registeredClient.getClientAuthenticationMethods()) {
-				clientAuthenticationMethodNames.add(clientAuthenticationMethod.getValue());
-			}
-
-			List<String> authorizationGrantTypeNames = new ArrayList<>(registeredClient.getAuthorizationGrantTypes().size());
-			for (AuthorizationGrantType authorizationGrantType : registeredClient.getAuthorizationGrantTypes()) {
-				authorizationGrantTypeNames.add(authorizationGrantType.getValue());
-			}
-
-			Instant issuedAt = registeredClient.getClientIdIssuedAt() != null ?
-					registeredClient.getClientIdIssuedAt() : Instant.now();
-
-			Timestamp clientSecretExpiresAt = registeredClient.getClientSecretExpiresAt() != null ?
-					Timestamp.from(registeredClient.getClientSecretExpiresAt()) : null;
-
-			Map<String, Object> clientSettings = new HashMap<>();
-			clientSettings.put("require_proof_key", registeredClient.getClientSettings().requireProofKey());
-			clientSettings.put("require_user_consent", registeredClient.getClientSettings().requireUserConsent());
-			String clientSettingsJson = writeMap(clientSettings);
-
-			Map<String, Object> tokenSettings = new HashMap<>();
-			tokenSettings.put("access_token_ttl", registeredClient.getTokenSettings().accessTokenTimeToLive().toMillis());
-			tokenSettings.put("reuse_refresh_tokens", registeredClient.getTokenSettings().reuseRefreshTokens());
-			tokenSettings.put("refresh_token_ttl", registeredClient.getTokenSettings().refreshTokenTimeToLive().toMillis());
-			String tokenSettingsJson = writeMap(tokenSettings);
-
-			return Arrays.asList(
-					new SqlParameterValue(Types.VARCHAR, registeredClient.getId()),
-					new SqlParameterValue(Types.VARCHAR, registeredClient.getClientId()),
-					new SqlParameterValue(Types.TIMESTAMP, Timestamp.from(issuedAt)),
-					new SqlParameterValue(Types.BLOB, registeredClient.getClientSecret().getBytes(StandardCharsets.UTF_8)),
-					new SqlParameterValue(Types.TIMESTAMP, clientSecretExpiresAt),
-					new SqlParameterValue(Types.VARCHAR, registeredClient.getClientName()),
-					new SqlParameterValue(Types.VARCHAR, StringUtils.collectionToCommaDelimitedString(clientAuthenticationMethodNames)),
-					new SqlParameterValue(Types.VARCHAR, StringUtils.collectionToCommaDelimitedString(authorizationGrantTypeNames)),
-					new SqlParameterValue(Types.VARCHAR, StringUtils.collectionToCommaDelimitedString(registeredClient.getRedirectUris())),
-					new SqlParameterValue(Types.VARCHAR, StringUtils.collectionToCommaDelimitedString(registeredClient.getScopes())),
-					new SqlParameterValue(Types.VARCHAR, clientSettingsJson),
-					new SqlParameterValue(Types.VARCHAR, tokenSettingsJson));
-		}
+		private final ObjectMapper objectMapper;
 
-		public final void setObjectMapper(ObjectMapper objectMapper) {
-			Assert.notNull(objectMapper, "objectMapper cannot be null");
+		private DefaultRegisteredClientParametersMapper(ObjectMapper objectMapper) {
 			this.objectMapper = objectMapper;
 		}
 
-		protected final ObjectMapper getObjectMapper() {
-			return this.objectMapper;
-		}
-
-		private String writeMap(Map<String, Object> data) {
+		@Override
+		public List<SqlParameterValue> apply(RegisteredClient registeredClient) {
 			try {
-				return this.objectMapper.writeValueAsString(data);
-			} catch (Exception ex) {
-				throw new IllegalArgumentException(ex.getMessage(), ex);
+				List<String> clientAuthenticationMethodNames = new ArrayList<>(registeredClient.getClientAuthenticationMethods().size());
+				for (ClientAuthenticationMethod clientAuthenticationMethod : registeredClient.getClientAuthenticationMethods()) {
+					clientAuthenticationMethodNames.add(clientAuthenticationMethod.getValue());
+				}
+
+				List<String> authorizationGrantTypeNames = new ArrayList<>(registeredClient.getAuthorizationGrantTypes().size());
+				for (AuthorizationGrantType authorizationGrantType : registeredClient.getAuthorizationGrantTypes()) {
+					authorizationGrantTypeNames.add(authorizationGrantType.getValue());
+				}
+
+				Instant issuedAt = registeredClient.getClientIdIssuedAt() != null ?
+						registeredClient.getClientIdIssuedAt() : Instant.now();
+
+				Timestamp clientSecretExpiresAt = registeredClient.getClientSecretExpiresAt() != null ?
+						Timestamp.from(registeredClient.getClientSecretExpiresAt()) : null;
+
+				Map<String, Object> clientSettings = new HashMap<>();
+				clientSettings.put("require_proof_key", registeredClient.getClientSettings().requireProofKey());
+				clientSettings.put("require_user_consent", registeredClient.getClientSettings().requireUserConsent());
+				String clientSettingsJson = this.objectMapper.writeValueAsString(clientSettings);
+
+				Map<String, Object> tokenSettings = new HashMap<>();
+				tokenSettings.put("access_token_ttl", registeredClient.getTokenSettings().accessTokenTimeToLive().toMillis());
+				tokenSettings.put("reuse_refresh_tokens", registeredClient.getTokenSettings().reuseRefreshTokens());
+				tokenSettings.put("refresh_token_ttl", registeredClient.getTokenSettings().refreshTokenTimeToLive().toMillis());
+				String tokenSettingsJson = this.objectMapper.writeValueAsString(tokenSettings);
+
+				return Arrays.asList(
+						new SqlParameterValue(Types.VARCHAR, registeredClient.getId()),
+						new SqlParameterValue(Types.VARCHAR, registeredClient.getClientId()),
+						new SqlParameterValue(Types.TIMESTAMP, Timestamp.from(issuedAt)),
+						new SqlParameterValue(Types.BLOB, registeredClient.getClientSecret().getBytes(StandardCharsets.UTF_8)),
+						new SqlParameterValue(Types.TIMESTAMP, clientSecretExpiresAt),
+						new SqlParameterValue(Types.VARCHAR, registeredClient.getClientName()),
+						new SqlParameterValue(Types.VARCHAR, StringUtils.collectionToCommaDelimitedString(clientAuthenticationMethodNames)),
+						new SqlParameterValue(Types.VARCHAR, StringUtils.collectionToCommaDelimitedString(authorizationGrantTypeNames)),
+						new SqlParameterValue(Types.VARCHAR, StringUtils.collectionToCommaDelimitedString(registeredClient.getRedirectUris())),
+						new SqlParameterValue(Types.VARCHAR, StringUtils.collectionToCommaDelimitedString(registeredClient.getScopes())),
+						new SqlParameterValue(Types.VARCHAR, clientSettingsJson),
+						new SqlParameterValue(Types.VARCHAR, tokenSettingsJson));
+			} catch (JsonProcessingException e) {
+				throw new IllegalArgumentException(e.getMessage(), e);
 			}
 		}
 

+ 12 - 3
oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/client/JdbcRegisteredClientRepositoryTests.java

@@ -20,13 +20,13 @@ import java.nio.charset.Charset;
 import java.time.Duration;
 import java.time.Instant;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.datasource.DriverManagerDataSource;
-import org.springframework.jdbc.support.lob.DefaultLobHandler;
 import org.springframework.security.oauth2.core.AuthorizationGrantType;
 import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
 import org.springframework.util.StreamUtils;
@@ -89,16 +89,25 @@ public class JdbcRegisteredClientRepositoryTests {
 	public void whenJdbcOperationsNullThenThrow() {
 		// @formatter:off
 		assertThatIllegalArgumentException()
-				.isThrownBy(() -> new JdbcRegisteredClientRepository(null, new DefaultLobHandler()))
+				.isThrownBy(() -> new JdbcRegisteredClientRepository(null, new ObjectMapper()))
 				.withMessage("jdbcOperations cannot be null");
 		// @formatter:on
 	}
 
 	@Test
-	public void whenLobHandlerNullThenThrow() {
+	public void whenObjectMapperNullThenThrow() {
 		// @formatter:off
 		assertThatIllegalArgumentException()
 				.isThrownBy(() -> new JdbcRegisteredClientRepository(this.jdbc, null))
+				.withMessage("objectMapper cannot be null");
+		// @formatter:on
+	}
+
+	@Test
+	public void whenLobHandlerNullThenThrow() {
+		// @formatter:off
+		assertThatIllegalArgumentException()
+				.isThrownBy(() -> new JdbcRegisteredClientRepository(this.jdbc, null, new ObjectMapper()))
 				.withMessage("lobHandler cannot be null");
 		// @formatter:on
 	}