Skip to content

Commit fe8f856

Browse files
Username can be updated in configuration (#1204)
* Allow users to update their username through configuration * Allow users to update their username through configuration * Allow users to update their username through configuration * Allow users to update their username through configuration * Allow users to update their username through configuration * Fix for workflow failure * Fix for workflow failure * fix: ci failure * Using more parameters to search for user --------- Co-authored-by: AssahBismarkabah <[email protected]>
1 parent 1977131 commit fe8f856

File tree

7 files changed

+96
-2
lines changed

7 files changed

+96
-2
lines changed

.github/workflows/ci.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ jobs:
280280

281281
- uses: actions/[email protected]
282282
with:
283-
python-version: 3.7
283+
python-version: 3.9
284284

285285
- uses: actions/[email protected]
286286
with:

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
### Added
9+
- Allow a user's username to be updated through the config [#810](https://github.com/adorsys/keycloak-config-cli/issues/810)
810

911
## [6.3.0] - 2025-02-03
1012
### Added

src/main/java/de/adorsys/keycloak/config/repository/UserRepository.java

+31-1
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,30 @@ public Optional<UserRepresentation> search(String realmName, String username) {
6868
return user;
6969
}
7070

71+
public Optional<UserRepresentation> searchByAttributes(String realmName, String email, String firstname, String lastname) {
72+
UsersResource usersResource = realmRepository.getResource(realmName).users();
73+
List<UserRepresentation> foundUsers = usersResource.search("", firstname, lastname, email,
74+
null, null, null, 0, 100, null, null);
75+
76+
for (UserRepresentation user : foundUsers) {
77+
if (email.equalsIgnoreCase(user.getEmail()) && firstname.equalsIgnoreCase(user.getFirstName())
78+
&& lastname.equalsIgnoreCase(user.getLastName())) {
79+
return Optional.of(user);
80+
}
81+
}
82+
return Optional.empty();
83+
}
84+
7185
final UserResource getResource(String realmName, String username) {
7286
UserRepresentation user = get(realmName, username);
7387
return realmRepository.getResource(realmName).users().get(user.getId());
7488
}
7589

90+
final UserResource getResource(String realmName, String username, String email, String firstname, String lastname) {
91+
UserRepresentation user = get(realmName, username, email, firstname, lastname);
92+
return realmRepository.getResource(realmName).users().get(user.getId());
93+
}
94+
7695
public UserRepresentation get(String realmName, String username) {
7796
Optional<UserRepresentation> user = search(realmName, username);
7897

@@ -81,6 +100,17 @@ public UserRepresentation get(String realmName, String username) {
81100
);
82101
}
83102

103+
public UserRepresentation get(String realmName, String username, String email, String firstname, String lastname) {
104+
Optional<UserRepresentation> user = search(realmName, username);
105+
if (user.isEmpty()) {
106+
user = searchByAttributes(realmName, email, firstname, lastname);
107+
}
108+
109+
return user.orElseThrow(
110+
() -> new KeycloakRepositoryException("Cannot find user '%s' or user with email '%s' in realm '%s'", username, email, realmName)
111+
);
112+
}
113+
84114
public void create(String realmName, UserRepresentation user) {
85115
RealmResource realmResource = realmRepository.getResource(realmName);
86116
UsersResource usersResource = realmResource.users();
@@ -91,7 +121,7 @@ public void create(String realmName, UserRepresentation user) {
91121
}
92122

93123
public void updateUser(String realmName, UserRepresentation user) {
94-
UserResource userResource = getResource(realmName, user.getUsername());
124+
UserResource userResource = getResource(realmName, user.getUsername(), user.getEmail(), user.getFirstName(), user.getLastName());
95125
userResource.update(user);
96126
}
97127

src/main/java/de/adorsys/keycloak/config/service/UserImportService.java

+5
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ public void importUser() {
129129

130130
Optional<UserRepresentation> maybeUser = userRepository.search(realmName, userToImport.getUsername());
131131

132+
if (maybeUser.isEmpty() && userToImport.getEmail() != null) {
133+
maybeUser = userRepository.searchByAttributes(realmName, userToImport.getEmail(), userToImport.getFirstName(),
134+
userToImport.getLastName());
135+
}
136+
132137
if (maybeUser.isPresent()) {
133138
updateUser(maybeUser.get());
134139
} else {

src/test/java/de/adorsys/keycloak/config/service/ImportUsersIT.java

+27
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,33 @@ void shouldUpdateUserWithEmailAsRegistration() throws IOException {
593593
assertThat(user.getFirstName(), is("My firstname 2"));
594594
assertThat(user.getLastName(), is("My lastname 2"));
595595
}
596+
@Test
597+
@Order(70)
598+
void shouldUpdateUserWithNewUsername() throws IOException {
599+
doImport("16.1_update_realm_change_users_username.json");
600+
601+
RealmRepresentation createdRealm = keycloakProvider.getInstance().realm(REALM_NAME).toRepresentation();
602+
603+
assertThat(createdRealm.getRealm(), is(REALM_NAME));
604+
assertThat(createdRealm.isEnabled(), is(true));
605+
606+
UserRepresentation user = keycloakRepository.getUser(REALM_NAME, "jake");
607+
608+
assertThat(user.getUsername(), is("jake"));
609+
assertThat(user.getEmail(), is("[email protected]"));
610+
assertThat(user.isEnabled(), is(true));
611+
assertThat(user.getFirstName(), is("My firstname"));
612+
assertThat(user.getLastName(), is("My lastname"));
613+
614+
doImport("16.2_update_realm_change_users_username.json");
615+
UserRepresentation updatedUser= keycloakRepository.getUser(REALM_NAME, "john123");
616+
assertThat(updatedUser.getUsername(), is("john123"));
617+
assertThat(updatedUser.getEmail(), is("[email protected]"));
618+
assertThat(updatedUser.isEnabled(), is(true));
619+
assertThat(updatedUser.getFirstName(), is("My firstname"));
620+
assertThat(updatedUser.getLastName(), is("My lastname"));
621+
622+
}
596623

597624
@Test
598625
@Order(80)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"enabled": true,
3+
"realm": "realmWithUsers",
4+
"registrationEmailAsUsername": false,
5+
"editUsernameAllowed": true,
6+
"users": [
7+
{
8+
"username": "jake",
9+
"email": "[email protected]",
10+
"enabled": true,
11+
"firstName": "My firstname",
12+
"lastName": "My lastname"
13+
}
14+
]
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"enabled": true,
3+
"realm": "realmWithUsers",
4+
"registrationEmailAsUsername": false,
5+
"editUsernameAllowed": true,
6+
"users": [
7+
{
8+
"username": "john123",
9+
"email": "[email protected]",
10+
"enabled": true,
11+
"firstName": "My firstname",
12+
"lastName": "My lastname"
13+
}
14+
]
15+
}

0 commit comments

Comments
 (0)