Compare commits

...

8 Commits

4 changed files with 253 additions and 112 deletions

133
.gitignore vendored Normal file
View File

@@ -0,0 +1,133 @@
# ============================================================================
# Lions User Manager - Server Implementation Quarkus - .gitignore
# ============================================================================
# Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
# Build artifacts
*.jar
*.war
*.ear
*.class
*.idx
# Eclipse
.project
.classpath
.settings/
.metadata/
bin/
# IntelliJ IDEA
.idea/
*.iml
*.iws
*.ipr
out/
# NetBeans
nbproject/
nbbuild/
nbdist/
.nb-gradle/
# VS Code
.vscode/
*.code-workspace
# Mac
.DS_Store
# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
# Logs
logs/
*.log
*.log.*
hs_err_pid*.log
# Quarkus
.quarkus/
quarkus-app/
quarkus-run.jar
quarkus-*.dat
# Temporary files
*.tmp
*.bak
*.swp
*~
*.orig
# Test files and reports
test_output*.txt
surefire-reports/
failsafe-reports/
*.dump
*.dumpstream
# Test coverage
.jacoco/
jacoco.exec
coverage/
target/site/jacoco/
# Application specific
application-local.properties
application-*.local.properties
# Configuration files with sensitive data
*.local.json
# Token and authentication files
token.json
token.txt
*.token
# Generated sources
generated-sources/
generated-test-sources/
# Maven status
maven-status/
# Build metrics
build-metrics.json
# Quarkus Dev Services
.devservices/
# Fichiers META-INF générés (reflection-config.json est généré par Quarkus)
**/META-INF/reflection-config.json
# IDE specific
*.sublime-project
*.sublime-workspace
# OS specific
.DS_Store?
._*
.Spotlight-V100
.Trashes
# Lombok configuration (généré automatiquement)
lombok.config
# Environment files
.env
.env.local
.env.*.local

View File

@@ -450,7 +450,7 @@ public class UserServiceImpl implements UserService {
} }
@Override @Override
public int importUsersFromCSV(@NotBlank String csvContent, @NotBlank String realmName) { public dev.lions.user.manager.dto.importexport.ImportResultDTO importUsersFromCSV(@NotBlank String csvContent, @NotBlank String realmName) {
// TODO: Implémenter l'import CSV // TODO: Implémenter l'import CSV
throw new UnsupportedOperationException("Import CSV non implémenté"); throw new UnsupportedOperationException("Import CSV non implémenté");
} }

View File

@@ -1,113 +1,113 @@
# ============================================================================ # ============================================================================
# Lions User Manager - Server Implementation Configuration - PRODUCTION # Lions User Manager Server - Configuration Production
# ============================================================================
# Ce fichier contient TOUTES les propriétés spécifiques à la production
# Il surcharge et complète application.properties
# ============================================================================ # ============================================================================
# HTTP Configuration # ============================================
quarkus.http.port=8081 # HTTP Configuration PROD
quarkus.http.host=0.0.0.0 # ============================================
quarkus.http.cors=true quarkus.http.port=8080
quarkus.http.cors.origins=https://btpxpress.lions.dev,https://admin.lions.dev
quarkus.http.cors.methods=GET,POST,PUT,DELETE,PATCH,OPTIONS
quarkus.http.cors.headers=*
# Keycloak OIDC Configuration (PROD) # CORS restrictif en production (via variable d'environnement) - autoriser le frontend users.lions.dev
quarkus.oidc.auth-server-url=https://security.lions.dev/realms/master quarkus.http.cors.origins=${CORS_ORIGINS:https://users.lions.dev,https://btpxpress.lions.dev,https://admin.lions.dev}
quarkus.oidc.client-id=lions-user-manager
quarkus.oidc.credentials.secret=${KEYCLOAK_CLIENT_SECRET}
quarkus.oidc.tls.verification=required
quarkus.oidc.application-type=service
# Keycloak Admin Client Configuration (PROD) # ============================================
lions.keycloak.server-url=https://security.lions.dev # Logging PROD (moins verbeux)
lions.keycloak.admin-realm=master # ============================================
lions.keycloak.admin-client-id=admin-cli
lions.keycloak.admin-username=${KEYCLOAK_ADMIN_USERNAME}
lions.keycloak.admin-password=${KEYCLOAK_ADMIN_PASSWORD}
lions.keycloak.connection-pool-size=20
lions.keycloak.timeout-seconds=60
# Realms autorisés (PROD)
lions.keycloak.authorized-realms=btpxpress,lions-realm
# Circuit Breaker Configuration (PROD - strict)
quarkus.smallrye-fault-tolerance.enabled=true
# Retry Configuration (PROD)
lions.keycloak.retry.max-attempts=5
lions.keycloak.retry.delay-seconds=3
# Audit Configuration (PROD)
lions.audit.enabled=true
lions.audit.log-to-database=true
lions.audit.log-to-file=true
lions.audit.retention-days=365
# Database Configuration (PROD - obligatoire pour audit)
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=${DB_USERNAME:audit_user}
quarkus.datasource.password=${DB_PASSWORD}
quarkus.datasource.jdbc.url=jdbc:postgresql://${DB_HOST:lions-db.lions.svc.cluster.local}:${DB_PORT:5432}/${DB_NAME:lions_audit}
quarkus.datasource.jdbc.max-size=20
quarkus.datasource.jdbc.min-size=5
quarkus.hibernate-orm.database.generation=none
quarkus.flyway.migrate-at-start=true
quarkus.flyway.baseline-on-migrate=true
quarkus.flyway.baseline-version=1.0.0
# Logging Configuration (PROD)
quarkus.log.level=INFO quarkus.log.level=INFO
quarkus.log.category."dev.lions.user.manager".level=INFO quarkus.log.category."dev.lions.user.manager".level=INFO
quarkus.log.category."org.keycloak".level=WARN quarkus.log.category."org.keycloak".level=WARN
quarkus.log.category."io.quarkus".level=WARN
quarkus.log.console.enable=true
quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n
quarkus.log.console.json=true
# File Logging pour Audit (PROD) # File Logging désactivé en prod Kubernetes (utilise stdout pour logs centralisés)
quarkus.log.file.enable=true # quarkus.log.file.path=/var/log/lions/lions-user-manager.log
quarkus.log.file.path=/var/log/lions/lions-user-manager.log # quarkus.log.file.rotation.max-file-size=50M
quarkus.log.file.rotation.max-file-size=50M # quarkus.log.file.rotation.max-backup-index=30
quarkus.log.file.rotation.max-backup-index=30 # quarkus.log.file.rotation.rotate-on-boot=false
quarkus.log.file.rotation.rotate-on-boot=false
# OpenAPI/Swagger Configuration (PROD - désactivé par défaut) # ============================================
quarkus.swagger-ui.always-include=false # OIDC Configuration PROD - OBLIGATOIRE ET ACTIF
quarkus.swagger-ui.path=/swagger-ui # ============================================
quarkus.oidc.enabled=true
quarkus.oidc.auth-server-url=${KEYCLOAK_AUTH_SERVER_URL:https://security.lions.dev/realms/lions-user-manager}
quarkus.oidc.client-id=${KEYCLOAK_CLIENT_ID:lions-user-manager-server}
# Client bearer-only - pas de secret nécessaire
# quarkus.oidc.credentials.secret=${KEYCLOAK_CLIENT_SECRET}
quarkus.oidc.token.issuer=${KEYCLOAK_AUTH_SERVER_URL:https://security.lions.dev/realms/lions-user-manager}
# Vérification TLS requise en production
quarkus.oidc.tls.verification=required
# Vérification stricte des tokens
quarkus.oidc.discovery-enabled=true
# quarkus.oidc.verify-access-token=true # Propriété non reconnue
# Extraction des rôles
quarkus.oidc.roles.role-claim-path=realm_access/roles
# ============================================
# Keycloak Admin Client Configuration PROD
# ============================================
lions.keycloak.server-url=${KEYCLOAK_SERVER_URL:https://security.lions.dev}
lions.keycloak.admin-realm=${KEYCLOAK_ADMIN_REALM:master}
lions.keycloak.admin-client-id=admin-cli
lions.keycloak.admin-username=${KEYCLOAK_ADMIN_USERNAME:admin}
lions.keycloak.admin-password=${KEYCLOAK_ADMIN_PASSWORD:KeycloakAdmin2025!}
# Pool de connexions augmenté en production
lions.keycloak.connection-pool-size=20
lions.keycloak.timeout-seconds=60
# Realms autorisés en production (via variable d'environnement)
lions.keycloak.authorized-realms=${KEYCLOAK_AUTHORIZED_REALMS:lions-user-manager,btpxpress,master,unionflow}
# ============================================
# Retry Configuration PROD
# ============================================
lions.keycloak.retry.max-attempts=5
lions.keycloak.retry.delay-seconds=3
# ============================================
# Audit Configuration PROD
# ============================================
lions.audit.retention-days=365
lions.audit.log-to-database=true
# ============================================
# Database Configuration PROD - Désactivé complètement
# ============================================
quarkus.datasource.devservices.enabled=false
quarkus.datasource.health.enabled=false
# ============================================
# OpenAPI/Swagger Configuration PROD
# ============================================
# Swagger désactivé en production par défaut (build-time property)
# quarkus.swagger-ui.always-include=false
quarkus.swagger-ui.enable=false quarkus.swagger-ui.enable=false
# Dev Services (désactivé en PROD) # ============================================
quarkus.devservices.enabled=false # Security Configuration PROD (strict)
# ============================================
# Ces propriétés sont build-time, configurées dans application.properties
# quarkus.security.auth.enabled=true
# quarkus.security.jaxrs.deny-unannotated-endpoints=true
# quarkus.security.auth.proactive=true
# Security Configuration (PROD - strict) # ============================================
quarkus.security.jaxrs.deny-unannotated-endpoints=true # Performance tuning PROD
# ============================================
quarkus.thread-pool.core-threads=4
quarkus.thread-pool.max-threads=32
quarkus.thread-pool.queue-size=200
# Health Check Configuration (PROD) # ============================================
quarkus.smallrye-health.root-path=/health # SSL/TLS Configuration PROD (optionnel)
quarkus.smallrye-health.liveness-path=/health/live # ============================================
quarkus.smallrye-health.readiness-path=/health/ready # Décommenter si le serveur gère le SSL directement (sinon géré par Ingress/Load Balancer)
# quarkus.http.ssl.certificate.key-store-file=${SSL_KEYSTORE_FILE:/etc/ssl/keystore.p12}
# Metrics Configuration (PROD) # quarkus.http.ssl.certificate.key-store-password=${SSL_KEYSTORE_PASSWORD}
quarkus.micrometer.enabled=true # quarkus.http.ssl.certificate.key-store-file-type=PKCS12
quarkus.micrometer.export.prometheus.enabled=true
quarkus.micrometer.export.prometheus.path=/metrics
# Jackson Configuration (PROD)
quarkus.jackson.fail-on-unknown-properties=false
quarkus.jackson.write-dates-as-timestamps=false
quarkus.jackson.serialization-inclusion=non_null
# Performance tuning (PROD)
quarkus.thread-pool.core-threads=2
quarkus.thread-pool.max-threads=16
quarkus.thread-pool.queue-size=100
# SSL/TLS Configuration (PROD)
quarkus.http.ssl.certificate.key-store-file=${SSL_KEYSTORE_FILE:/etc/ssl/keystore.p12}
quarkus.http.ssl.certificate.key-store-password=${SSL_KEYSTORE_PASSWORD}
quarkus.http.ssl.certificate.key-store-file-type=PKCS12
# Monitoring & Observability
quarkus.log.handler.gelf.enabled=false
quarkus.log.handler.gelf.host=${GRAYLOG_HOST:logs.lions.dev}
quarkus.log.handler.gelf.port=${GRAYLOG_PORT:12201}

View File

@@ -33,8 +33,7 @@ lions.keycloak.timeout-seconds=30
# Realms autorisés (séparés par virgule) # Realms autorisés (séparés par virgule)
lions.keycloak.authorized-realms=btpxpress,master,lions-realm lions.keycloak.authorized-realms=btpxpress,master,lions-realm
# Circuit Breaker Configuration # Circuit Breaker Configuration (SmallRye Fault Tolerance est activé par défaut)
quarkus.smallrye-fault-tolerance.enabled=true
# Retry Configuration (pour appels Keycloak) # Retry Configuration (pour appels Keycloak)
lions.keycloak.retry.max-attempts=3 lions.keycloak.retry.max-attempts=3
@@ -46,14 +45,22 @@ lions.audit.log-to-database=false
lions.audit.log-to-file=true lions.audit.log-to-file=true
lions.audit.retention-days=90 lions.audit.retention-days=90
# Database Configuration (optionnel - pour logs d'audit) # Database Configuration (pour logs d'audit et données opérationnelles)
# Décommenter si vous voulez persister les logs d'audit en DB # DÉSACTIVÉ - Non utilisé en production (logs gérés par Kubernetes)
#quarkus.datasource.db-kind=postgresql quarkus.datasource.health.enabled=false
#quarkus.datasource.username=${DB_USERNAME:audit_user} quarkus.datasource.devservices.enabled=false
#quarkus.datasource.password=${DB_PASSWORD:audit_pass} quarkus.datasource.db-kind=postgresql
#quarkus.datasource.jdbc.url=jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:lions_audit} quarkus.datasource.username=${DB_USERNAME:lions_user}
#quarkus.hibernate-orm.database.generation=none quarkus.datasource.password=${DB_PASSWORD:lions_password}
#quarkus.flyway.migrate-at-start=true quarkus.datasource.jdbc.url=jdbc:postgresql://${DB_HOST:localhost}:${DB_PORT:5432}/${DB_NAME:lions_user_manager}
# Hibernate ORM Configuration
quarkus.hibernate-orm.database.generation=update
quarkus.hibernate-orm.log.sql=false
# Flyway Configuration
# DÉSACTIVÉ - Pas de base de données en production
quarkus.flyway.migrate-at-start=false
# Logging Configuration # Logging Configuration
quarkus.log.level=INFO quarkus.log.level=INFO
@@ -64,10 +71,11 @@ quarkus.log.console.enable=true
quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{3.}] (%t) %s%e%n
# File Logging pour Audit # File Logging pour Audit
quarkus.log.file.enable=true # DÉSACTIVÉ - Logs gérés par Kubernetes (stdout/stderr)
quarkus.log.file.path=logs/lions-user-manager.log quarkus.log.file.enable=false
quarkus.log.file.rotation.max-file-size=10M # quarkus.log.file.path=logs/lions-user-manager.log
quarkus.log.file.rotation.max-backup-index=10 # quarkus.log.file.rotation.max-file-size=10M
# quarkus.log.file.rotation.max-backup-index=10
# OpenAPI/Swagger Configuration # OpenAPI/Swagger Configuration
quarkus.swagger-ui.always-include=true quarkus.swagger-ui.always-include=true