456 lines
15 KiB
Bash
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 "============================================================================="
|