3333import org .keycloak .benchmark .dataset .config .DatasetException ;
3434import org .keycloak .benchmark .dataset .organization .OrganizationProvisioner ;
3535import org .keycloak .connections .infinispan .InfinispanConnectionProvider ;
36+ import org .keycloak .credential .hash .PasswordHashProvider ;
3637import org .keycloak .events .Event ;
3738import org .keycloak .events .EventStoreProvider ;
3839import org .keycloak .events .EventType ;
5253import org .keycloak .models .UserModel ;
5354import org .keycloak .models .UserSessionModel ;
5455import org .keycloak .models .cache .CacheRealmProvider ;
56+ import org .keycloak .models .credential .PasswordCredentialModel ;
5557import org .keycloak .models .utils .KeycloakModelUtils ;
5658import org .keycloak .protocol .oidc .OIDCAdvancedConfigWrapper ;
5759import org .keycloak .protocol .oidc .OIDCLoginProtocol ;
7173import java .util .concurrent .atomic .AtomicInteger ;
7274import java .util .regex .Pattern ;
7375import java .util .stream .Collectors ;
76+ import java .util .stream .IntStream ;
7477
7578import static org .keycloak .benchmark .dataset .config .DatasetOperation .CREATE_CLIENTS ;
7679import static org .keycloak .benchmark .dataset .config .DatasetOperation .CREATE_EVENTS ;
@@ -435,6 +438,8 @@ private void createUsersImpl(Task task, DatasetConfig config, RealmModel realm)
435438 }
436439
437440 private void addUserCreationTasks (RealmContext context , Task task , DatasetConfig config , ExecutorHelper executor , int startIndex , int usersCount ) {
441+ // Initialize password credentials if unique-credentials-count is configured
442+ List <PasswordCredentialModel > credentials = initializeCredentials (config , context );
438443
439444 for (int i = startIndex ; i < (startIndex + usersCount ); i += config .getUsersPerTransaction ()) {
440445 final int usersStartIndex = i ;
@@ -446,7 +451,7 @@ private void addUserCreationTasks(RealmContext context, Task task, DatasetConfig
446451 executor .addTaskRunningInTransaction (session -> {
447452 KeycloakModelUtils .cloneContextRealmClientToSession (baseSession .getContext (), session );
448453
449- createUsers (context , session , usersStartIndex , endIndex );
454+ createUsers (context , session , usersStartIndex , endIndex , credentials );
450455
451456 task .debug (logger , "Created users in realm %s from %d to %d" , context .getRealm ().getName (), usersStartIndex , endIndex );
452457
@@ -457,6 +462,17 @@ private void addUserCreationTasks(RealmContext context, Task task, DatasetConfig
457462 }
458463 }
459464
465+ private List <PasswordCredentialModel > initializeCredentials (DatasetConfig config , RealmContext context ) {
466+ PasswordPolicy policy = context .getRealm ().getPasswordPolicy ();
467+ PasswordHashProvider hash = policy .getHashAlgorithm () != null ?
468+ baseSession .getProvider (PasswordHashProvider .class , policy .getHashAlgorithm ()) :
469+ baseSession .getProvider (PasswordHashProvider .class );
470+
471+ return IntStream .range (0 , config .getUniqueCredentialCount ())
472+ .boxed ()
473+ .map (i -> hash .encodedCredential ("password-" + i , policy .getHashIterations ()))
474+ .toList ();
475+ }
460476
461477 @ GET
462478 @ Path ("/create-events" )
@@ -1130,7 +1146,7 @@ private void createClients(RealmContext context, Task task, KeycloakSession sess
11301146 }
11311147
11321148 // Worker task to be triggered by single executor thread
1133- private void createUsers (RealmContext context , KeycloakSession session , int startIndex , int endIndex ) {
1149+ private void createUsers (RealmContext context , KeycloakSession session , int startIndex , int endIndex , List < PasswordCredentialModel > credentials ) {
11341150 // Refresh the realm
11351151 RealmModel realm = session .realms ().getRealm (context .getRealm ().getId ());
11361152 DatasetConfig config = context .getConfig ();
@@ -1147,8 +1163,13 @@ private void createUsers(RealmContext context, KeycloakSession session, int star
11471163 user .setLastName (username + "-last" );
11481164 user .setEmail (username + String .format ("@%s.com" , realm .getName ()));
11491165
1150- String password = String .format ("%s-password" , username );
1151- user .credentialManager ().updateCredential (UserCredentialModel .password (password , false ));
1166+ if (credentials .isEmpty ()) {
1167+ String password = String .format ("%s-password" , username );
1168+ user .credentialManager ().updateCredential (UserCredentialModel .password (password , false ));
1169+ } else {
1170+ PasswordCredentialModel password = credentials .get (i % config .getUniqueCredentialCount ());
1171+ user .credentialManager ().createStoredCredential (password );
1172+ }
11521173
11531174 // Assign a role to a user if any exist in the realm
11541175 if (!context .getRealmRoles ().isEmpty ()) {
0 commit comments