Skip to content

Commit ecc8dfc

Browse files
committed
Add update support in JdbcRegisteredClientRepository
Closes spring-projectsgh-356
1 parent 79fd004 commit ecc8dfc

File tree

2 files changed

+41
-22
lines changed

2 files changed

+41
-22
lines changed

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

+25-4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
*
5555
* @author Rafal Lewczuk
5656
* @author Joe Grandja
57+
* @author Ovidiu Popa
5758
* @since 0.1.2
5859
* @see RegisteredClientRepository
5960
* @see RegisteredClient
@@ -79,13 +80,23 @@ public class JdbcRegisteredClientRepository implements RegisteredClientRepositor
7980

8081
private static final String TABLE_NAME = "oauth2_registered_client";
8182

83+
private static final String PK_FILTER = "id = ?";
84+
8285
private static final String LOAD_REGISTERED_CLIENT_SQL = "SELECT " + COLUMN_NAMES + " FROM " + TABLE_NAME + " WHERE ";
8386

8487
// @formatter:off
8588
private static final String INSERT_REGISTERED_CLIENT_SQL = "INSERT INTO " + TABLE_NAME
8689
+ "(" + COLUMN_NAMES + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
8790
// @formatter:on
8891

92+
// @formatter:off
93+
private static final String UPDATE_REGISTERED_CLIENT_SQL = "UPDATE " + TABLE_NAME
94+
+ " SET client_id = ?, client_id_issued_at = ?, client_secret = ?, client_secret_expires_at = ?,"
95+
+ " client_name = ?, client_authentication_methods = ?, authorization_grant_types = ?,"
96+
+ " redirect_uris = ?, scopes = ?, client_settings = ?, token_settings = ?"
97+
+ " WHERE " + PK_FILTER;
98+
// @formatter:on
99+
89100
private final JdbcOperations jdbcOperations;
90101
private RowMapper<RegisteredClient> registeredClientRowMapper;
91102
private Function<RegisteredClient, List<SqlParameterValue>> registeredClientParametersMapper;
@@ -108,11 +119,21 @@ public void save(RegisteredClient registeredClient) {
108119
RegisteredClient existingRegisteredClient = findBy("id = ? OR client_id = ?",
109120
registeredClient.getId(), registeredClient.getClientId());
110121
if (existingRegisteredClient != null) {
111-
Assert.isTrue(!existingRegisteredClient.getId().equals(registeredClient.getId()),
112-
"Registered client must be unique. Found duplicate identifier: " + registeredClient.getId());
113-
Assert.isTrue(!existingRegisteredClient.getClientId().equals(registeredClient.getClientId()),
114-
"Registered client must be unique. Found duplicate client identifier: " + registeredClient.getClientId());
122+
updateRegisteredClient(registeredClient);
123+
} else {
124+
insertRegisteredClient(registeredClient);
115125
}
126+
}
127+
128+
private void updateRegisteredClient(RegisteredClient registeredClient) {
129+
List<SqlParameterValue> parameters = new ArrayList<>(this.registeredClientParametersMapper.apply(registeredClient));
130+
SqlParameterValue id = parameters.remove(0);
131+
parameters.add(id);
132+
PreparedStatementSetter pss = new ArgumentPreparedStatementSetter(parameters.toArray());
133+
this.jdbcOperations.update(UPDATE_REGISTERED_CLIENT_SQL, pss);
134+
}
135+
136+
private void insertRegisteredClient(RegisteredClient registeredClient) {
116137
List<SqlParameterValue> parameters = this.registeredClientParametersMapper.apply(registeredClient);
117138
PreparedStatementSetter pss = new ArgumentPreparedStatementSetter(parameters.toArray());
118139
this.jdbcOperations.update(INSERT_REGISTERED_CLIENT_SQL, pss);

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

+16-18
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
2626
import com.fasterxml.jackson.core.type.TypeReference;
2727
import com.fasterxml.jackson.databind.Module;
2828
import com.fasterxml.jackson.databind.ObjectMapper;
29+
2930
import org.junit.After;
3031
import org.junit.Before;
3132
import org.junit.Test;
32-
3333
import org.springframework.jdbc.core.ArgumentPreparedStatementSetter;
3434
import org.springframework.jdbc.core.JdbcOperations;
3535
import org.springframework.jdbc.core.JdbcTemplate;
@@ -58,6 +58,7 @@
5858
* @author Rafal Lewczuk
5959
* @author Steve Riesenberg
6060
* @author Joe Grandja
61+
* @author Ovidiu Popa
6162
*/
6263
public class JdbcRegisteredClientRepositoryTests {
6364
private static final String OAUTH2_REGISTERED_CLIENT_SCHEMA_SQL_RESOURCE = "/org/springframework/security/oauth2/server/authorization/client/oauth2-registered-client-schema.sql";
@@ -113,26 +114,23 @@ public void saveWhenRegisteredClientNullThenThrowIllegalArgumentException() {
113114
}
114115

115116
@Test
116-
public void saveWhenExistingIdThenThrowIllegalArgumentException() {
117-
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
118-
this.registeredClientRepository.save(registeredClient);
117+
public void saveWhenRegisteredClientExistsThenUpdated() {
118+
RegisteredClient originalRegisteredClient = TestRegisteredClients.registeredClient().build();
119+
this.registeredClientRepository.save(originalRegisteredClient);
119120

120-
assertThatIllegalArgumentException()
121-
.isThrownBy(() -> this.registeredClientRepository.save(registeredClient))
122-
.withMessage("Registered client must be unique. Found duplicate identifier: " + registeredClient.getId());
123-
}
121+
RegisteredClient registeredClient = this.registeredClientRepository.findById(
122+
originalRegisteredClient.getId());
123+
assertThat(registeredClient).isEqualTo(originalRegisteredClient);
124124

125-
@Test
126-
public void saveWhenExistingClientIdThenThrowIllegalArgumentException() {
127-
RegisteredClient existingRegisteredClient = TestRegisteredClients.registeredClient().build();
128-
this.registeredClientRepository.save(existingRegisteredClient);
129-
RegisteredClient registeredClient = RegisteredClient.from(existingRegisteredClient)
130-
.id("registration-2")
131-
.build();
125+
RegisteredClient updatedRegisteredClient = RegisteredClient.from(originalRegisteredClient)
126+
.clientName("clientName").scope("scope2").build();
132127

133-
assertThatIllegalArgumentException()
134-
.isThrownBy(() -> this.registeredClientRepository.save(registeredClient))
135-
.withMessage("Registered client must be unique. Found duplicate client identifier: " + registeredClient.getClientId());
128+
this.registeredClientRepository.save(updatedRegisteredClient);
129+
130+
registeredClient = this.registeredClientRepository.findById(
131+
updatedRegisteredClient.getId());
132+
assertThat(registeredClient).isEqualTo(updatedRegisteredClient);
133+
assertThat(registeredClient).isNotEqualTo(originalRegisteredClient);
136134
}
137135

138136
@Test

0 commit comments

Comments
 (0)