Skip to content

Commit 73483cf

Browse files
committed
Add update support in JdbcRegisteredClientRepository
Closes gh-356
1 parent a3b14a9 commit 73483cf

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

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
*
5757
* @author Rafal Lewczuk
5858
* @author Joe Grandja
59+
* @author Ovidiu Popa
5960
* @since 0.1.2
6061
* @see RegisteredClientRepository
6162
* @see RegisteredClient
@@ -81,13 +82,23 @@ public class JdbcRegisteredClientRepository implements RegisteredClientRepositor
8182

8283
private static final String TABLE_NAME = "oauth2_registered_client";
8384

85+
private static final String PK_FILTER = "id = ?";
86+
8487
private static final String LOAD_REGISTERED_CLIENT_SQL = "SELECT " + COLUMN_NAMES + " FROM " + TABLE_NAME + " WHERE ";
8588

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

94+
// @formatter:off
95+
private static final String UPDATE_REGISTERED_CLIENT_SQL = "UPDATE " + TABLE_NAME
96+
+ " SET client_id = ?, client_id_issued_at = ?, client_secret = ?, client_secret_expires_at = ?,"
97+
+ " client_name = ?, client_authentication_methods = ?, authorization_grant_types = ?,"
98+
+ " redirect_uris = ?, scopes = ?, client_settings = ?, token_settings = ?"
99+
+ " WHERE " + PK_FILTER;
100+
// @formatter:on
101+
91102
private final JdbcOperations jdbcOperations;
92103
private RowMapper<RegisteredClient> registeredClientRowMapper;
93104
private Function<RegisteredClient, List<SqlParameterValue>> registeredClientParametersMapper;
@@ -110,11 +121,21 @@ public void save(RegisteredClient registeredClient) {
110121
RegisteredClient existingRegisteredClient = findBy("id = ? OR client_id = ?",
111122
registeredClient.getId(), registeredClient.getClientId());
112123
if (existingRegisteredClient != null) {
113-
Assert.isTrue(!existingRegisteredClient.getId().equals(registeredClient.getId()),
114-
"Registered client must be unique. Found duplicate identifier: " + registeredClient.getId());
115-
Assert.isTrue(!existingRegisteredClient.getClientId().equals(registeredClient.getClientId()),
116-
"Registered client must be unique. Found duplicate client identifier: " + registeredClient.getClientId());
124+
updateRegisteredClient(registeredClient);
125+
} else {
126+
insertRegisteredClient(registeredClient);
117127
}
128+
}
129+
130+
private void updateRegisteredClient(RegisteredClient registeredClient) {
131+
List<SqlParameterValue> parameters = new ArrayList<>(this.registeredClientParametersMapper.apply(registeredClient));
132+
SqlParameterValue id = parameters.remove(0);
133+
parameters.add(id);
134+
PreparedStatementSetter pss = new ArgumentPreparedStatementSetter(parameters.toArray());
135+
this.jdbcOperations.update(UPDATE_REGISTERED_CLIENT_SQL, pss);
136+
}
137+
138+
private void insertRegisteredClient(RegisteredClient registeredClient) {
118139
List<SqlParameterValue> parameters = this.registeredClientParametersMapper.apply(registeredClient);
119140
PreparedStatementSetter pss = new ArgumentPreparedStatementSetter(parameters.toArray());
120141
this.jdbcOperations.update(INSERT_REGISTERED_CLIENT_SQL, pss);

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

Lines changed: 16 additions & 18 deletions
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;
@@ -60,6 +60,7 @@
6060
* @author Rafal Lewczuk
6161
* @author Steve Riesenberg
6262
* @author Joe Grandja
63+
* @author Ovidiu Popa
6364
*/
6465
public class JdbcRegisteredClientRepositoryTests {
6566
private static final String OAUTH2_REGISTERED_CLIENT_SCHEMA_SQL_RESOURCE = "/org/springframework/security/oauth2/server/authorization/client/oauth2-registered-client-schema.sql";
@@ -115,26 +116,23 @@ public void saveWhenRegisteredClientNullThenThrowIllegalArgumentException() {
115116
}
116117

117118
@Test
118-
public void saveWhenExistingIdThenThrowIllegalArgumentException() {
119-
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
120-
this.registeredClientRepository.save(registeredClient);
119+
public void saveWhenRegisteredClientExistsThenUpdated() {
120+
RegisteredClient originalRegisteredClient = TestRegisteredClients.registeredClient().build();
121+
this.registeredClientRepository.save(originalRegisteredClient);
121122

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

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

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

140138
@Test

0 commit comments

Comments
 (0)