# ============================================================================= # SCRIPT POWERSHELL D'IMPLÉMENTATION ARCHITECTURE RÔLES UNIONFLOW DANS KEYCLOAK # ============================================================================= # # Ce script configure complètement l'architecture des rôles UnionFlow : # - 8 rôles métier hiérarchiques # - 8 comptes de test avec rôles assignés # - Attributs utilisateur et permissions # # Prérequis : Keycloak accessible sur http://192.168.1.145:8180 # Realm : unionflow # Admin : admin/admin # # Usage : .\Setup-UnionFlow-Keycloak.ps1 # ============================================================================= # Configuration $KEYCLOAK_URL = "http://192.168.1.145:8180" $REALM = "unionflow" $ADMIN_USER = "admin" $ADMIN_PASSWORD = "admin" $CLIENT_ID = "unionflow-mobile" # Fonctions d'affichage avec couleurs function Write-Info($message) { Write-Host "[INFO] $message" -ForegroundColor Blue } function Write-Success($message) { Write-Host "[SUCCESS] $message" -ForegroundColor Green } function Write-Warning($message) { Write-Host "[WARNING] $message" -ForegroundColor Yellow } function Write-Error($message) { Write-Host "[ERROR] $message" -ForegroundColor Red } # Fonction pour obtenir le token d'administration function Get-AdminToken { Write-Info "Obtention du token d'administration..." $body = @{ username = $ADMIN_USER password = $ADMIN_PASSWORD grant_type = "password" client_id = "admin-cli" } try { $response = Invoke-RestMethod -Uri "$KEYCLOAK_URL/realms/master/protocol/openid-connect/token" -Method Post -Body $body -ContentType "application/x-www-form-urlencoded" if ($response.access_token) { $global:ADMIN_TOKEN = $response.access_token Write-Success "Token d'administration obtenu" return $true } } catch { Write-Error "Impossible d'obtenir le token d'administration: $($_.Exception.Message)" return $false } return $false } # Fonction pour vérifier si un rôle existe function Test-RoleExists($roleName) { try { $headers = @{ Authorization = "Bearer $global:ADMIN_TOKEN" } $response = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/roles/$roleName" -Method Get -Headers $headers return $true } catch { return $false } } # Fonction pour créer un rôle function New-Role($roleName, $description, $level) { Write-Info "Création du rôle: $roleName (niveau $level)" if (Test-RoleExists $roleName) { Write-Warning "Le rôle $roleName existe déjà" return $true } $roleData = @{ name = $roleName description = $description attributes = @{ level = @($level) hierarchy = @($level) } } | ConvertTo-Json -Depth 3 try { $headers = @{ Authorization = "Bearer $global:ADMIN_TOKEN" "Content-Type" = "application/json" } Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/roles" -Method Post -Body $roleData -Headers $headers Write-Success "Rôle $roleName créé avec succès" return $true } catch { Write-Error "Erreur lors de la création du rôle $roleName : $($_.Exception.Message)" return $false } } # Fonction pour vérifier si un utilisateur existe function Test-UserExists($username) { try { $headers = @{ Authorization = "Bearer $global:ADMIN_TOKEN" } $response = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/users?username=$username" -Method Get -Headers $headers return $response.Count -gt 0 } catch { return $false } } # Fonction pour obtenir l'ID d'un utilisateur function Get-UserId($username) { try { $headers = @{ Authorization = "Bearer $global:ADMIN_TOKEN" } $response = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/users?username=$username" -Method Get -Headers $headers if ($response.Count -gt 0) { return $response[0].id } } catch { return $null } return $null } # Fonction pour créer un utilisateur function New-User($username, $email, $password, $firstName, $lastName) { Write-Info "Création de l'utilisateur: $username ($email)" if (Test-UserExists $username) { Write-Warning "L'utilisateur $username existe déjà" return $true } $userData = @{ username = $username email = $email firstName = $firstName lastName = $lastName enabled = $true emailVerified = $true credentials = @( @{ type = "password" value = $password temporary = $false } ) } | ConvertTo-Json -Depth 3 try { $headers = @{ Authorization = "Bearer $global:ADMIN_TOKEN" "Content-Type" = "application/json" } Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/users" -Method Post -Body $userData -Headers $headers Write-Success "Utilisateur $username créé avec succès" return $true } catch { Write-Error "Erreur lors de la création de l'utilisateur $username : $($_.Exception.Message)" return $false } } # Fonction pour assigner un rôle à un utilisateur function Add-RoleToUser($username, $roleName) { Write-Info "Attribution du rôle $roleName à l'utilisateur $username" # Obtenir l'ID de l'utilisateur $userId = Get-UserId $username if (-not $userId) { Write-Error "Impossible de trouver l'utilisateur $username" return $false } # Obtenir les détails du rôle try { $headers = @{ Authorization = "Bearer $global:ADMIN_TOKEN" } $role = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/roles/$roleName" -Method Get -Headers $headers $assignmentData = @( @{ id = $role.id name = $role.name } ) | ConvertTo-Json -Depth 2 $headers["Content-Type"] = "application/json" Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/users/$userId/role-mappings/realm" -Method Post -Body $assignmentData -Headers $headers Write-Success "Rôle $roleName assigné à $username" return $true } catch { Write-Error "Erreur lors de l'assignation du rôle $roleName à $username : $($_.Exception.Message)" return $false } } # ============================================================================= # DÉBUT DU SCRIPT PRINCIPAL # ============================================================================= Write-Host "=============================================================================" -ForegroundColor Cyan Write-Host "🚀 CONFIGURATION ARCHITECTURE RÔLES UNIONFLOW DANS KEYCLOAK" -ForegroundColor Cyan Write-Host "=============================================================================" -ForegroundColor Cyan Write-Host "" # Étape 1: Obtenir le token d'administration if (-not (Get-AdminToken)) { Write-Error "Impossible de continuer sans token d'administration" exit 1 } Write-Host "" Write-Host "=============================================================================" -ForegroundColor Cyan Write-Host "📋 ÉTAPE 1: CRÉATION DES RÔLES MÉTIER" -ForegroundColor Cyan Write-Host "=============================================================================" -ForegroundColor Cyan Write-Host "" # Création des 8 rôles métier avec hiérarchie $roles = @( @{ Name = "SUPER_ADMINISTRATEUR"; Description = "Super Administrateur - Accès système complet"; Level = "100" }, @{ Name = "ADMINISTRATEUR_ORGANISATION"; Description = "Administrateur Organisation - Gestion complète organisation"; Level = "85" }, @{ Name = "RESPONSABLE_TECHNIQUE"; Description = "Responsable Technique - Configuration et workflows"; Level = "80" }, @{ Name = "RESPONSABLE_FINANCIER"; Description = "Responsable Financier - Gestion finances et budget"; Level = "75" }, @{ Name = "RESPONSABLE_MEMBRES"; Description = "Responsable Membres - Gestion communauté"; Level = "70" }, @{ Name = "MEMBRE_ACTIF"; Description = "Membre Actif - Participation et organisation"; Level = "50" }, @{ Name = "MEMBRE_SIMPLE"; Description = "Membre Simple - Participation standard"; Level = "30" }, @{ Name = "VISITEUR"; Description = "Visiteur - Accès public découverte"; Level = "0" } ) foreach ($role in $roles) { New-Role $role.Name $role.Description $role.Level } Write-Host "" Write-Host "=============================================================================" -ForegroundColor Cyan Write-Host "👥 ÉTAPE 2: CRÉATION DES COMPTES DE TEST" -ForegroundColor Cyan Write-Host "=============================================================================" -ForegroundColor Cyan Write-Host "" # Création des 8 comptes de test $users = @( @{ Username = "superadmin"; Email = "superadmin@unionflow.dev"; Password = "SuperAdmin123!"; FirstName = "Super"; LastName = "Admin" }, @{ Username = "admin.org"; Email = "admin@association-dev.fr"; Password = "AdminOrg123!"; FirstName = "Admin"; LastName = "Organisation" }, @{ Username = "tech.lead"; Email = "tech@association-dev.fr"; Password = "TechLead123!"; FirstName = "Tech"; LastName = "Lead" }, @{ Username = "tresorier"; Email = "tresorier@association-dev.fr"; Password = "Tresorier123!"; FirstName = "Trésorier"; LastName = "Finance" }, @{ Username = "rh.manager"; Email = "rh@association-dev.fr"; Password = "RhManager123!"; FirstName = "RH"; LastName = "Manager" }, @{ Username = "marie.active"; Email = "marie@association-dev.fr"; Password = "Marie123!"; FirstName = "Marie"; LastName = "Active" }, @{ Username = "jean.simple"; Email = "jean@association-dev.fr"; Password = "Jean123!"; FirstName = "Jean"; LastName = "Simple" }, @{ Username = "visiteur"; Email = "visiteur@example.com"; Password = "Visiteur123!"; FirstName = "Visiteur"; LastName = "Public" } ) foreach ($user in $users) { New-User $user.Username $user.Email $user.Password $user.FirstName $user.LastName } Write-Host "" Write-Host "=============================================================================" -ForegroundColor Cyan Write-Host "🔗 ÉTAPE 3: ATTRIBUTION DES RÔLES AUX UTILISATEURS" -ForegroundColor Cyan Write-Host "=============================================================================" -ForegroundColor Cyan Write-Host "" # Attribution des rôles aux utilisateurs $userRoleAssignments = @( @{ Username = "superadmin"; Role = "SUPER_ADMINISTRATEUR" }, @{ Username = "admin.org"; Role = "ADMINISTRATEUR_ORGANISATION" }, @{ Username = "tech.lead"; Role = "RESPONSABLE_TECHNIQUE" }, @{ Username = "tresorier"; Role = "RESPONSABLE_FINANCIER" }, @{ Username = "rh.manager"; Role = "RESPONSABLE_MEMBRES" }, @{ Username = "marie.active"; Role = "MEMBRE_ACTIF" }, @{ Username = "jean.simple"; Role = "MEMBRE_SIMPLE" }, @{ Username = "visiteur"; Role = "VISITEUR" } ) foreach ($assignment in $userRoleAssignments) { Add-RoleToUser $assignment.Username $assignment.Role } Write-Host "" Write-Host "=============================================================================" -ForegroundColor Cyan Write-Host "✅ CONFIGURATION TERMINÉE AVEC SUCCÈS" -ForegroundColor Cyan Write-Host "=============================================================================" -ForegroundColor Cyan Write-Host "" Write-Success "Architecture des rôles UnionFlow configurée dans Keycloak !" Write-Host "" Write-Host "📋 RÉSUMÉ DE LA CONFIGURATION :" -ForegroundColor White Write-Host "• 8 rôles métier créés avec hiérarchie" -ForegroundColor White Write-Host "• 8 comptes de test créés et configurés" -ForegroundColor White Write-Host "• Rôles assignés aux utilisateurs appropriés" -ForegroundColor White Write-Host "" Write-Host "🔐 COMPTES DE TEST DISPONIBLES :" -ForegroundColor White Write-Host "• superadmin@unionflow.dev (SUPER_ADMINISTRATEUR)" -ForegroundColor White Write-Host "• admin@association-dev.fr (ADMINISTRATEUR_ORGANISATION)" -ForegroundColor White Write-Host "• tech@association-dev.fr (RESPONSABLE_TECHNIQUE)" -ForegroundColor White Write-Host "• tresorier@association-dev.fr (RESPONSABLE_FINANCIER)" -ForegroundColor White Write-Host "• rh@association-dev.fr (RESPONSABLE_MEMBRES)" -ForegroundColor White Write-Host "• marie@association-dev.fr (MEMBRE_ACTIF)" -ForegroundColor White Write-Host "• jean@association-dev.fr (MEMBRE_SIMPLE)" -ForegroundColor White Write-Host "• visiteur@example.com (VISITEUR)" -ForegroundColor White Write-Host "" Write-Host "🚀 Vous pouvez maintenant tester l'authentification avec ces comptes !" -ForegroundColor Green