in pkg/client/keycloak/adapter/gocloak_adapter.go [866:909]
func (a GoCloakAdapter) AddClientRoleToUser(realmName string, clientId string, user *dto.User, roleName string) error {
log := a.log.WithValues(keycloakApiParamRole, roleName, logKeyRealm, realmName, "user", user.Username)
log.Info("Start mapping realm role to user in Keycloak...")
client, err := a.client.GetClients(context.Background(), a.token.AccessToken, realmName, gocloak.GetClientsParams{
ClientID: &clientId,
})
if err != nil {
return fmt.Errorf("failed to get client %s: %w", clientId, err)
}
if len(client) == 0 {
return fmt.Errorf("no such client %v has been found", clientId)
}
role, err := a.client.GetClientRole(context.Background(), a.token.AccessToken, realmName, *client[0].ID, roleName)
if err != nil {
return errors.Wrap(err, "error during GetClientRole")
}
if role == nil {
return errors.Errorf("no such client role %v has been found", roleName)
}
users, err := a.client.GetUsers(context.Background(), a.token.AccessToken, realmName, gocloak.GetUsersParams{
Username: &user.Username,
})
if err != nil {
return fmt.Errorf("failed to get user %s: %w", user.Username, err)
}
if len(users) == 0 {
return fmt.Errorf("no such user %v has been found", user.Username)
}
err = a.addClientRoleToUser(realmName, *users[0].ID, []gocloak.Role{*role})
if err != nil {
return err
}
log.Info("Role to user has been added")
return nil
}