#!/bin/bash # ============================================================================= # SCRIPT 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.11:8180 # Realm : unionflow # Admin : admin/admin # # Usage : ./setup-unionflow-keycloak.sh # ============================================================================= set -e # Arrêter le script en cas d'erreur # Configuration KEYCLOAK_URL="http://192.168.1.11:8180" REALM="unionflow" ADMIN_USER="admin" ADMIN_PASSWORD="admin" CLIENT_ID="unionflow-mobile" # Couleurs pour l'affichage RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Fonction d'affichage avec couleurs log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # Fonction pour obtenir le token d'administration get_admin_token() { log_info "Obtention du token d'administration..." local response=$(curl -s -X POST \ "${KEYCLOAK_URL}/realms/master/protocol/openid-connect/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=${ADMIN_USER}" \ -d "password=${ADMIN_PASSWORD}" \ -d "grant_type=password" \ -d "client_id=admin-cli") if [ $? -eq 0 ]; then ADMIN_TOKEN=$(echo "$response" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4) if [ -n "$ADMIN_TOKEN" ]; then log_success "Token d'administration obtenu" return 0 fi fi log_error "Impossible d'obtenir le token d'administration" echo "Réponse: $response" exit 1 } # Fonction pour vérifier si un rôle existe role_exists() { local role_name="$1" local response=$(curl -s -X GET \ "${KEYCLOAK_URL}/admin/realms/${REALM}/roles/${role_name}" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json") if echo "$response" | grep -q '"name"'; then return 0 # Le rôle existe else return 1 # Le rôle n'existe pas fi } # Fonction pour créer un rôle create_role() { local role_name="$1" local description="$2" local level="$3" log_info "Création du rôle: $role_name (niveau $level)" if role_exists "$role_name"; then log_warning "Le rôle $role_name existe déjà" return 0 fi local role_data='{ "name": "'$role_name'", "description": "'$description'", "attributes": { "level": ["'$level'"], "hierarchy": ["'$level'"] } }' local response=$(curl -s -X POST \ "${KEYCLOAK_URL}/admin/realms/${REALM}/roles" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json" \ -d "$role_data") if [ $? -eq 0 ]; then log_success "Rôle $role_name créé avec succès" else log_error "Erreur lors de la création du rôle $role_name" echo "Réponse: $response" fi } # Fonction pour vérifier si un utilisateur existe user_exists() { local username="$1" local response=$(curl -s -X GET \ "${KEYCLOAK_URL}/admin/realms/${REALM}/users?username=${username}" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json") if echo "$response" | grep -q '"username"'; then return 0 # L'utilisateur existe else return 1 # L'utilisateur n'existe pas fi } # Fonction pour obtenir l'ID d'un utilisateur get_user_id() { local username="$1" local response=$(curl -s -X GET \ "${KEYCLOAK_URL}/admin/realms/${REALM}/users?username=${username}" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json") echo "$response" | grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4 } # Fonction pour créer un utilisateur create_user() { local username="$1" local email="$2" local password="$3" local first_name="$4" local last_name="$5" log_info "Création de l'utilisateur: $username ($email)" if user_exists "$username"; then log_warning "L'utilisateur $username existe déjà" return 0 fi local user_data='{ "username": "'$username'", "email": "'$email'", "firstName": "'$first_name'", "lastName": "'$last_name'", "enabled": true, "emailVerified": true, "credentials": [{ "type": "password", "value": "'$password'", "temporary": false }] }' local response=$(curl -s -X POST \ "${KEYCLOAK_URL}/admin/realms/${REALM}/users" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json" \ -d "$user_data") if [ $? -eq 0 ]; then log_success "Utilisateur $username créé avec succès" else log_error "Erreur lors de la création de l'utilisateur $username" echo "Réponse: $response" fi } # Fonction pour assigner un rôle à un utilisateur assign_role_to_user() { local username="$1" local role_name="$2" log_info "Attribution du rôle $role_name à l'utilisateur $username" # Obtenir l'ID de l'utilisateur local user_id=$(get_user_id "$username") if [ -z "$user_id" ]; then log_error "Impossible de trouver l'utilisateur $username" return 1 fi # Obtenir les détails du rôle local role_response=$(curl -s -X GET \ "${KEYCLOAK_URL}/admin/realms/${REALM}/roles/${role_name}" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json") local role_id=$(echo "$role_response" | grep -o '"id":"[^"]*' | cut -d'"' -f4) if [ -z "$role_id" ]; then log_error "Impossible de trouver le rôle $role_name" return 1 fi # Assigner le rôle local assignment_data='[{ "id": "'$role_id'", "name": "'$role_name'" }]' local response=$(curl -s -X POST \ "${KEYCLOAK_URL}/admin/realms/${REALM}/users/${user_id}/role-mappings/realm" \ -H "Authorization: Bearer ${ADMIN_TOKEN}" \ -H "Content-Type: application/json" \ -d "$assignment_data") if [ $? -eq 0 ]; then log_success "Rôle $role_name assigné à $username" else log_error "Erreur lors de l'assignation du rôle $role_name à $username" echo "Réponse: $response" fi } # ============================================================================= # DÉBUT DU SCRIPT PRINCIPAL # ============================================================================= echo "=============================================================================" echo "🚀 CONFIGURATION ARCHITECTURE RÔLES UNIONFLOW DANS KEYCLOAK" echo "=============================================================================" echo "" # Étape 1: Obtenir le token d'administration get_admin_token echo "" echo "=============================================================================" echo "📋 ÉTAPE 1: CRÉATION DES RÔLES MÉTIER" echo "=============================================================================" echo "" # Création des 8 rôles métier avec hiérarchie create_role "SUPER_ADMINISTRATEUR" "Super Administrateur - Accès système complet" "100" create_role "ADMINISTRATEUR_ORGANISATION" "Administrateur Organisation - Gestion complète organisation" "85" create_role "RESPONSABLE_TECHNIQUE" "Responsable Technique - Configuration et workflows" "80" create_role "RESPONSABLE_FINANCIER" "Responsable Financier - Gestion finances et budget" "75" create_role "RESPONSABLE_MEMBRES" "Responsable Membres - Gestion communauté" "70" create_role "MEMBRE_ACTIF" "Membre Actif - Participation et organisation" "50" create_role "MEMBRE_SIMPLE" "Membre Simple - Participation standard" "30" create_role "VISITEUR" "Visiteur - Accès public découverte" "0" echo "" echo "=============================================================================" echo "👥 ÉTAPE 2: CRÉATION DES COMPTES DE TEST" echo "=============================================================================" echo "" # Création des 8 comptes de test create_user "superadmin" "superadmin@unionflow.dev" "SuperAdmin123!" "Super" "Admin" create_user "admin.org" "admin@association-dev.fr" "AdminOrg123!" "Admin" "Organisation" create_user "tech.lead" "tech@association-dev.fr" "TechLead123!" "Tech" "Lead" create_user "tresorier" "tresorier@association-dev.fr" "Tresorier123!" "Trésorier" "Finance" create_user "rh.manager" "rh@association-dev.fr" "RhManager123!" "RH" "Manager" create_user "marie.active" "marie@association-dev.fr" "Marie123!" "Marie" "Active" create_user "jean.simple" "jean@association-dev.fr" "Jean123!" "Jean" "Simple" create_user "visiteur" "visiteur@example.com" "Visiteur123!" "Visiteur" "Public" echo "" echo "=============================================================================" echo "🔗 ÉTAPE 3: ATTRIBUTION DES RÔLES AUX UTILISATEURS" echo "=============================================================================" echo "" # Attribution des rôles aux utilisateurs assign_role_to_user "superadmin" "SUPER_ADMINISTRATEUR" assign_role_to_user "admin.org" "ADMINISTRATEUR_ORGANISATION" assign_role_to_user "tech.lead" "RESPONSABLE_TECHNIQUE" assign_role_to_user "tresorier" "RESPONSABLE_FINANCIER" assign_role_to_user "rh.manager" "RESPONSABLE_MEMBRES" assign_role_to_user "marie.active" "MEMBRE_ACTIF" assign_role_to_user "jean.simple" "MEMBRE_SIMPLE" assign_role_to_user "visiteur" "VISITEUR" echo "" echo "=============================================================================" echo "✅ CONFIGURATION TERMINÉE AVEC SUCCÈS" echo "=============================================================================" echo "" log_success "Architecture des rôles UnionFlow configurée dans Keycloak !" echo "" echo "📋 RÉSUMÉ DE LA CONFIGURATION :" echo "• 8 rôles métier créés avec hiérarchie" echo "• 8 comptes de test créés et configurés" echo "• Rôles assignés aux utilisateurs appropriés" echo "" echo "🔐 COMPTES DE TEST DISPONIBLES :" echo "• superadmin@unionflow.dev (SUPER_ADMINISTRATEUR)" echo "• admin@association-dev.fr (ADMINISTRATEUR_ORGANISATION)" echo "• tech@association-dev.fr (RESPONSABLE_TECHNIQUE)" echo "• tresorier@association-dev.fr (RESPONSABLE_FINANCIER)" echo "• rh@association-dev.fr (RESPONSABLE_MEMBRES)" echo "• marie@association-dev.fr (MEMBRE_ACTIF)" echo "• jean@association-dev.fr (MEMBRE_SIMPLE)" echo "• visiteur@example.com (VISITEUR)" echo "" echo "🚀 Vous pouvez maintenant tester l'authentification avec ces comptes !" echo "" echo "=============================================================================" echo "🔍 ÉTAPE 4: VÉRIFICATION DE LA CONFIGURATION" echo "=============================================================================" echo "" # Fonction de vérification des rôles verify_roles() { log_info "Vérification des rôles créés..." local roles=("SUPER_ADMINISTRATEUR" "ADMINISTRATEUR_ORGANISATION" "RESPONSABLE_TECHNIQUE" "RESPONSABLE_FINANCIER" "RESPONSABLE_MEMBRES" "MEMBRE_ACTIF" "MEMBRE_SIMPLE" "VISITEUR") for role in "${roles[@]}"; do if role_exists "$role"; then log_success "✓ Rôle $role vérifié" else log_error "✗ Rôle $role manquant" fi done } # Fonction de vérification des utilisateurs verify_users() { log_info "Vérification des utilisateurs créés..." local users=("superadmin" "admin.org" "tech.lead" "tresorier" "rh.manager" "marie.active" "jean.simple" "visiteur") for user in "${users[@]}"; do if user_exists "$user"; then log_success "✓ Utilisateur $user vérifié" else log_error "✗ Utilisateur $user manquant" fi done } # Fonction de test d'authentification test_authentication() { log_info "Test d'authentification avec un compte de test..." local test_response=$(curl -s -X POST \ "${KEYCLOAK_URL}/realms/${REALM}/protocol/openid-connect/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=marie.active" \ -d "password=Marie123!" \ -d "grant_type=password" \ -d "client_id=${CLIENT_ID}") if echo "$test_response" | grep -q "access_token"; then log_success "✓ Test d'authentification réussi avec marie.active" else log_error "✗ Échec du test d'authentification" echo "Réponse: $test_response" fi } # Fonction d'affichage des informations de connexion display_connection_info() { echo "" echo "=============================================================================" echo "📱 INFORMATIONS DE CONNEXION POUR L'APPLICATION MOBILE" echo "=============================================================================" echo "" echo "🔗 Configuration Keycloak :" echo " • URL Serveur: $KEYCLOAK_URL" echo " • Realm: $REALM" echo " • Client ID: $CLIENT_ID" echo "" echo "🧪 Comptes de test par rôle :" echo "" echo " 🔴 SUPER_ADMINISTRATEUR" echo " Username: superadmin" echo " Email: superadmin@unionflow.dev" echo " Password: SuperAdmin123!" echo "" echo " 🔵 ADMINISTRATEUR_ORGANISATION" echo " Username: admin.org" echo " Email: admin@association-dev.fr" echo " Password: AdminOrg123!" echo "" echo " 🟢 RESPONSABLE_TECHNIQUE" echo " Username: tech.lead" echo " Email: tech@association-dev.fr" echo " Password: TechLead123!" echo "" echo " 🟡 RESPONSABLE_FINANCIER" echo " Username: tresorier" echo " Email: tresorier@association-dev.fr" echo " Password: Tresorier123!" echo "" echo " 🟣 RESPONSABLE_MEMBRES" echo " Username: rh.manager" echo " Email: rh@association-dev.fr" echo " Password: RhManager123!" echo "" echo " 🟠 MEMBRE_ACTIF" echo " Username: marie.active" echo " Email: marie@association-dev.fr" echo " Password: Marie123!" echo "" echo " ⚪ MEMBRE_SIMPLE" echo " Username: jean.simple" echo " Email: jean@association-dev.fr" echo " Password: Jean123!" echo "" echo " 🔵 VISITEUR" echo " Username: visiteur" echo " Email: visiteur@example.com" echo " Password: Visiteur123!" echo "" } # Exécution des vérifications verify_roles echo "" verify_users echo "" test_authentication # Affichage des informations finales display_connection_info echo "=============================================================================" echo "🎉 CONFIGURATION UNIONFLOW KEYCLOAK TERMINÉE AVEC SUCCÈS !" echo "============================================================================="