Refactoring
This commit is contained in:
455
setup-unionflow-keycloak.sh
Normal file
455
setup-unionflow-keycloak.sh
Normal file
@@ -0,0 +1,455 @@
|
||||
#!/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.145: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.145: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 "============================================================================="
|
||||
Reference in New Issue
Block a user