Files
unionflow-server-impl-quarkus/setup-unionflow-keycloak.sh

456 lines
15 KiB
Bash

#!/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 "============================================================================="