Skip to content

Commit e1b803c

Browse files
ovidiupopa07jgrandja
authored andcommitted
Add update support in JdbcRegisteredClientRepository
Closes spring-projectsgh-356
1 parent c6fce40 commit e1b803c

File tree

2 files changed

+48
-24
lines changed

2 files changed

+48
-24
lines changed

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

+29-6
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_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;
@@ -107,14 +118,26 @@ public JdbcRegisteredClientRepository(JdbcOperations jdbcOperations) {
107118
@Override
108119
public void save(RegisteredClient registeredClient) {
109120
Assert.notNull(registeredClient, "registeredClient cannot be null");
110-
RegisteredClient existingRegisteredClient = findBy("id = ? OR client_id = ?",
111-
registeredClient.getId(), registeredClient.getClientId());
121+
RegisteredClient existingRegisteredClient = findBy(PK_FILTER,
122+
registeredClient.getId());
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.remove(0); // remove client_id
134+
parameters.remove(0); // remove client_id_issued_at
135+
parameters.add(id);
136+
PreparedStatementSetter pss = new ArgumentPreparedStatementSetter(parameters.toArray());
137+
this.jdbcOperations.update(UPDATE_REGISTERED_CLIENT_SQL, pss);
138+
}
139+
140+
private void insertRegisteredClient(RegisteredClient registeredClient) {
118141
List<SqlParameterValue> parameters = this.registeredClientParametersMapper.apply(registeredClient);
119142
PreparedStatementSetter pss = new ArgumentPreparedStatementSetter(parameters.toArray());
120143
this.jdbcOperations.update(INSERT_REGISTERED_CLIENT_SQL, pss);

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

+19-18
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.sql.ResultSet;
1919
import java.sql.SQLException;
2020
import java.sql.Timestamp;
21+
import java.time.Instant;
2122
import java.util.List;
2223
import java.util.Map;
2324
import java.util.Set;
@@ -26,10 +27,10 @@
2627
import com.fasterxml.jackson.core.type.TypeReference;
2728
import com.fasterxml.jackson.databind.Module;
2829
import com.fasterxml.jackson.databind.ObjectMapper;
30+
2931
import org.junit.After;
3032
import org.junit.Before;
3133
import org.junit.Test;
32-
3334
import org.springframework.jdbc.core.ArgumentPreparedStatementSetter;
3435
import org.springframework.jdbc.core.JdbcOperations;
3536
import org.springframework.jdbc.core.JdbcTemplate;
@@ -60,6 +61,7 @@
6061
* @author Rafal Lewczuk
6162
* @author Steve Riesenberg
6263
* @author Joe Grandja
64+
* @author Ovidiu Popa
6365
*/
6466
public class JdbcRegisteredClientRepositoryTests {
6567
private static final String OAUTH2_REGISTERED_CLIENT_SCHEMA_SQL_RESOURCE = "/org/springframework/security/oauth2/server/authorization/client/oauth2-registered-client-schema.sql";
@@ -115,26 +117,25 @@ public void saveWhenRegisteredClientNullThenThrowIllegalArgumentException() {
115117
}
116118

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

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

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();
128+
RegisteredClient updatedRegisteredClient = RegisteredClient.from(originalRegisteredClient)
129+
.clientId("test").clientIdIssuedAt(Instant.now()).clientName("clientName").scope("scope2").build();
134130

135-
assertThatIllegalArgumentException()
136-
.isThrownBy(() -> this.registeredClientRepository.save(registeredClient))
137-
.withMessage("Registered client must be unique. Found duplicate client identifier: " + registeredClient.getClientId());
131+
RegisteredClient expectedUpdatedRegisteredClient = RegisteredClient.from(originalRegisteredClient)
132+
.clientName("clientName").scope("scope2").build();
133+
this.registeredClientRepository.save(updatedRegisteredClient);
134+
135+
registeredClient = this.registeredClientRepository.findById(
136+
updatedRegisteredClient.getId());
137+
assertThat(registeredClient).isEqualTo(expectedUpdatedRegisteredClient);
138+
assertThat(registeredClient).isNotEqualTo(originalRegisteredClient);
138139
}
139140

140141
@Test

0 commit comments

Comments
 (0)