PFE Projet
PFE Projet
FARES Hajar
Membres de jury :
Présidente : Pr. HNIDA Meriem
Encadrante académique : Pr. HILAL Imane
Tuteur du stage : Mr. ELKHADIRI Nawfal
Promotion : 2022/2025
Dédicace
À mes parents
À vous, mes chers parents, qui avez été les premiers bâtisseurs de ma vie. Votre amour
sans condition, vos sacrifices silencieux et votre confiance infinie m’ont soutenu et guidé
jusqu’à présent. C’est dans vos regards que j’ai trouvé la force de continuer, et c’est à
travers vos prières que j’ai découvert le chemin de la réussite. Je vous dois tout ce que je
suis devenu aujourd’hui.
À ma sœur
À toi, ma sœur, ma complice depuis toujours. Ton sourire, ton écoute et ta douceur m’ont
accompagné dans les moments de doute comme dans les instants de bonheur. Ta présence
a été pour moi une lumière réconfortante qui a su dissiper bien des inquiétudes. Merci
d’avoir été là, simplement, avec sincérité.
À Mami, cette femme au cœur immense, que le destin a mise sur mon chemin comme un
cadeau. Ton amour maternel, ton attention constante et ta sagesse ont été pour moi une
source de paix et de courage. Tu es bien plus qu’une deuxième mère, tu es un refuge, un
repère, une étoile bienveillante dans mon ciel.
À mon oncle et à sa famille, si précieuse à mon cœur. Votre affection discrète, vos paroles
réconfortantes et vos encouragements m’ont donné l’envie de toujours aller de l’avant.
Vous avez su être une source de chaleur et de force dans les moments où j’en avais le plus
besoin. Merci pour votre présence inestimable.
Remerciements
Je tiens à exprimer toute ma gratitude à celles et ceux qui, de près ou de loin, ont
contribué à la réalisation de ce travail.
Je remercie tout d’abord Madame Hilal Imane, mon encadrante académique, pour
sa disponibilité, ses conseils éclairés et son accompagnement bienveillant tout au long de
ce projet. Sa rigueur et ses remarques constructives ont été précieuses pour faire avancer
mon travail dans la bonne direction.
Mes remerciements s’adressent également à Madame Hanane Oulhaj, pour son ac-
cueil chaleureux, son suivi attentif et ses conseils précieux qui ont enrichi mon stage et
facilité mon intégration dans l’équipe.
Un grand merci à toute l’équipe de travail au sein de Lear, pour l’atmosphère pro-
fessionnelle et amicale qui a accompagné mon apprentissage. Une mention spéciale à
Bourahouat Ghizlane, pour son aide précieuse, sa disponibilité et ses encouragements
constants.
Je remercie également les membres du jury, pour le temps qu’ils consacreront à l’éva-
luation de ce travail et pour l’intérêt porté à mon projet.
Enfin, je n’oublie pas toutes les personnes — proches, amis ou collègues — qui, par
leur soutien, leurs encouragements ont contribué de près ou de loin à la réussite de ce
projet.
Résumé
Ce Projet de Fin d’études s’inscrit dans une démarche d’automatisation avancée de la
sécurité des applications d’entreprise. Il a abouti à la conception et au développement du
module blueprint à intégrer dans l’écosystème JHipster afin d’ajouter automatiquement
une couche de sécurité complète fondée sur le modèle RBAC (Role-Based Access Control).
Ce blueprint va bien au-delà d’une simple génération de code : il implémente un
mécanisme structuré de gestion des rôles, des permissions et de la hiérarchie des accès,
compatible à la fois avec les architectures monolithiques et microservices. Il s’intègre
directement dans le processus de génération de projet avec JHipster, en injectant des
composants backend (Spring Boot), frontend (Angular), ainsi que des configurations de
sécurité avancées.
Grâce à cette solution, Lear Corporation bénéficie d’un gain de temps significatif dans
le développement des applications basées sur Jhispter, en garantissant une sécurité renfor-
cée dès la phase initiale, une réduction importante de la complexité liée à la configuration
manuelle des droits d’accès. Ce module blueprint représente ainsi une brique technique
réutilisable, évolutive et adaptée aux exigences en matière de sécurité des accès
ﺓ ﻭ ﻭ ﺃ ﺕ .ﻭ ﺕﺍ ﺃ ﻥ ﺭ ﻭﻉ ﺍﺍ ﺭﺝ
ﺫﺝ ﺁ ﺃ ﻥ ﻑﺇ JHipster، ﺇ ﺭﺍ ﺩ ﺝ Blueprint
ﺍ ﺩﻭﺍﺭ (RBAC). ﻝﺍ ﺍ ﺍ
ﺕ ﺩﺍﺭﺓ ﺍ ﺩﻭﺍﺭ ﻭﺍ ﺁ ﻡ ، ﺓﺍ ﺍ ﺓ ﻩﺍ
ﺓ ﺓ (Microservices).ﻭ ﺕﺍ ﻭﺍ ﺭ ﺍ ﺍ ﺕ ،ﻭ ﺍ ﻭ
ﺕ Boot) (Spring Backendﻭ(Angular) Frontend ﻝ ﺇﺩ ﻝ ﺍ ﻭﻉ JHipster
. ﺇ ﺇ ﺍﺩﺍﺕ ﺃ ﻥ
ﺓ ﺕﺍ ﺍ ﺍ Corporation Lear ﺍﺍ ،
ﺍﺩ ﺍ ﺍ ﻭﻉ ،ﻭ ﺍ ﻭ ﺍ ﺍ ﻯﺃ ﻥ ﻥ JHipster،
ﻝﺃ ﻥ ﺍ ،ﻭ ﺍﻡ، ﺩﺓ ﺍ ﺓ ﻩﺍ ﺕ ﻭ ً .ﻭ ُ ﺍ
ﻝ. ﺍ
ﺕSpring ، ﺍ ﻭﺭ (RBAC)،ﺃ ﻥ ﺍ ﻝ ﺍ Blueprint، JHipster، :ﺍ ﺕﺍ ﺍ
ﺕﻭ ّ ﺓ (Microservices)،ﺇﺩﺍﺭﺓ ﺍ ﺕﺍ Angular، Boot،ﺍ
Table des matières
Introduction générale 1
2 Revue de littérature 9
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1 La sécurité applicative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 La gestion de la confidentialité des applications . . . . . . . . . . . . . . . 10
2.2.1 RBAC (Role-Based Access Control) : Contrôle d’accès basé sur les
rôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
i
2.2.2 ABAC (Attribute-Based Access Control) : Contrôle d’accès basé
sur les attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.3 PBAC (Policy-Based Access Control) : Contrôle d’accès basé sur
les politiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.4 CPAC (Context-Based Access Control) : Contrôle d’accès basé sur
le contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3 Benchmark des modèles de sécurité des applications . . . . . . . . . . . . . 12
2.4 Justification du choix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.5 Écosystème technologique de JHipster . . . . . . . . . . . . . . . . . . . . 13
2.5.1 JHipster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5.2 Les architectures jhipster . . . . . . . . . . . . . . . . . . . . . . . 13
2.5.3 JHipster et Consul . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.5.4 JHipster et Keycloak . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.5.5 JHipster et Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.5.6 Spring Boot : le socle backend . . . . . . . . . . . . . . . . . . . . . 16
2.5.7 Angular : framework frontend moderne . . . . . . . . . . . . . . . . 16
2.6 Blueprnt Jhipster : Personnalisation avancée . . . . . . . . . . . . . . . . 16
2.6.1 Qu’est-ce qu’un Blueprint dans JHipster ? . . . . . . . . . . . . . . 16
2.6.2 Objectifs des Blueprints JHipster . . . . . . . . . . . . . . . . . . . 16
2.6.3 Exemples de Blueprints Officiels . . . . . . . . . . . . . . . . . . . . 17
2.6.4 Cycle de vie d’un Blueprint JHipster . . . . . . . . . . . . . . . . . 17
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
ii
4.3.1Objectif1 : Sécuriser les endpoints backend . . . . . . . . . . 37
4.3.2Objectif2 : Communication des permissions entre le Gateway et les
microservices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.3.3 Objectif 3 : Communication entre microservices . . . . . . . . . . . 47
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Conclusion 77
iii
Table des figures
5.1 carte mentale: action du blueprint sur frontend des applications JHipster . 50
iv
Table des abréviations
Abréviation Signification
ABAC Attribute-Based Access Control
API Application Programming Interface
CABC Context-Aware Access Control
Consul Système de service discovery et configuration
CRUD Create, Read, Update, Delete
DB Base de données (Database)
DTO Data Transfer Object
Feign Client HTTP déclaratif pour la communication inter-
services
HTTP HyperText Transfer Protocol
JHipster Générateur d’applications Web basé sur Java et An-
gular
JSON JavaScript Object Notation
JWT JSON Web Token
Keycloak Serveur d’authentification et d’autorisation Open
Source
Microservice Architecture logicielle basée sur des services auto-
nomes
OAuth2 Open Authorization 2.0
PBAC Policy-Based Access Control
RBAC Role-Based Access Control
REST Representational State Transfer
UI User Interface
v
Liste des tableaux
vi
Listings
vii
Introduction générale
La gestion des accès utilisateurs représente l’un des enjeux majeurs en cybersécuri-
té. Il ne s’agit plus seulement d’authentifier un utilisateur, mais également de contrôler
précisément ce à quoi il peut accéder, selon ses responsabilités, son rôle et son contexte
d’usage. Une mauvaise configuration des droits d’accès peut exposer une organisation à
des violations graves de données, à des fuites d’informations critiques ou à des sabotages
internes. La sécurisation fine des accès constitue donc un impératif, tant pour protéger
les actifs numériques que pour garantir la conformité et la continuité d’activité.
Face à ces enjeux, ce projet s’est orienté vers la mise en place d’une solution tech-
nique adaptée. L’objectif est de concevoir et développer un outil automatisé capable de
renforcer la gestion des rôles, des permissions et de la hiérarchie des accès dans les ap-
plications d’[Link] y répondre, nous avons mis en place un blueprint JHipster
capable d’ajouter automatiquement cette couche de sécurité dans les applications .Ce
composant repose sur le modèle RBAC (Role-Based Access Control), Permettant une ré-
partition cohérente et organisée des autorisations d’accès. Ce mémoire présente l’ensemble
du processus suivi, depuis l’analyse des besoins jusqu’aux résultats obtenus, en passant
par les choix techniques opérés et les perspectives d’amélioration.
1
• Chapitre 1 : Contexte générale du projet.
2
Chapitre 1
Introduction
Le premier chapitre de ce mémoire est consacré à l’analyse du contexte dans lequel
le projet a vu le jour. Il s’agit de présenter l’organisme d’accueil, d’identifier les besoins
métiers, les enjeux de sécurité et les contraintes techniques qui ont motivé la mise en place
de la solution proposée. Cette contextualisation permet de mieux cerner la problématique
à laquelle le projet répond.
3
1.2.2 E-Systems (systèmes électriques et électroniques)
Ce secteur regroupe l’ensemble des solutions technologiques embarquées, couvrant
l’électronique de puissance, les modules de gestion de l’énergie, ainsi que les architec-
tures électriques, les faisceaux de câblage, les calculateurs et les logiciels intégrés. Lear
se distingue particulièrement dans les domaines de l’électrification des véhicules, de la
connectivité et de la cybersécurité automobile[3].
4
Élément Détail
Nom de la société Lear Corporation Automotive Electronics Morocco
Statut juridique Société par actions simplifiée (SAS)
Surface du site 14 340 m²
Date de création Avril 2010, inauguration officielle en mai 2011
Secteur d’activités Assemblage de cartes électroniques pour véhicules
Chiffre d’affaires De 100 000 000 à 500 000 000 DH
Effectif Entre 500 et 1000 (estimation en 2017)
Principaux clients BMW, DAIMLER, Renault, Volvo, Jaguar
Capital social 22 470 000 DH (en 2017)
Adresse Technopolis-RabatShore, plot 34-37, 11100 Sala Al Ja-
dida, Maroc
5
un modèle RBAC (Role-Based Access Control). Ce blueprint, pensé pour être générique,
est compatible aussi bien avec les projets monolithiques qu’avec les architectures micro-
services, facilitant l’intégration et la réutilisation dans divers cas d’usage rencontrés chez
Lear Corporation.
1.6 Problématique
Face à des exigences de plus en plus strictes en matière de conformité réglementaire
et de cybersécurité, les entreprises sont confrontées à la nécessité de renforcer le contrôle
des accès aux ressources applicatives. Dans un environnement numérique où le volume
de données sensibles ne cesse de croître, la maîtrise fine des droits d’accès devient un
levier stratégique pour prévenir les risques, assurer la confidentialité des informations, et
se conformer aux standards internationaux de sécurité.
Néanmoins, dans de nombreuses organisations, la gestion des droits d’accès reste fré-
quemment manuelle, fragmentée et dénuée de toute standardisation entre les diverses
applications. Cette absence d’uniformité engendre des incohérences, rend la maintenance
plus complexe et accroît l’exposition aux risques de sécurité.
JHipster facilitent la création d’applications web performantes de manière rapide, mais
son mécanisme de gestion des rôles reste souvent basique, se concentrant principalement
sur quelques rôles fondamentaux tels que ROLE-USER et ROLE-ADMIN. Ainsi, il ne
répond pas suffisamment aux exigences lorsqu’il devient nécessaire de mettre en place un
contrôle d’accès plus précis,flexible et plus adaptable aux spécificités de chaque projet
Ainsi, cela soulève la question suivante :
Comment développer une solution centralisée, adaptable et automatisée
pour la génération de la configuration responsable d’assurer la confiden-
tialité des applications basées sur JHipster, tout en assurant une sécurité
granulaire, cohérente et conforme au modèle RBAC ?
• Analyser les dispositifs de sécurité fournis par JHipster afin d’en évaluer les limites,
en particulier celles liées au manque de précision dans la gestion des accès et à
l’absence de contrôle granulaire des permissions.
• Concevoir un modèle RBAC amélioré, reposant sur l’entité Authority existante dans
JHipster, et enrichi par l’ajout d’entités Permission. Ce modèle permettra de gérer
les permissions de manière dynamique et précise pour chaque rôle.
6
• Automatiser la génération des composants nécessaires,côté backend et côté frontend.
• Garantir une compatibilité native avec le logiciel Keycloak en se basant sur le pro-
tocole OAuth2, tout en respectant les bonnes pratiques en matière de sécurité ap-
plicative.
• Sécuriser les endpoints REST en fonction des permissions associées à chaque rôle et
utilisateur, en garantissant que chaque endpoint est accessible uniquement par les
utilisateurs possédant les permissions nécessaires.
• Analyse des besoins Avant chaque phase de développement, une analyse des besoins
a été effectuée afin de :
Cette analyse préalable m’a permis de poser une base claire avant toute implémen-
tation.
• Conception technique Une fois les besoins analysés, une phase de conception tech-
nique a été réalisée. Elle a permis de :
Cette phase a été essentielle pour garantir une cohérence technique dans tout le
blueprint.
7
• Tests et validation Chaque fonctionnalité développée a été testée pour :
• Suivi via diagramme de Gantt Un diagramme de Gantt figure 1.3 a été élaboré pour
planifier et visualiser les différentes étapes du projet. Il m’a servi de support pour :
Conclusion
En résumé, ce chapitre a permis de poser les bases du projet en exposant les enjeux
métiers, les exigences de sécurité, ainsi que les contraintes techniques et organisationnelles.
Cette analyse du contexte constitue une étape essentielle pour comprendre les choix tech-
nologiques et les orientations méthodologiques adoptées dans les chapitres suivants.
8
Chapitre 2
Revue de littérature
Introduction
Ce chapitre offre une analyse approfondie des fondements et des enjeux de la sécurité
informatique, en particulier dans le cadre des applications modernes. Nous y définissons
les principes essentiels de la sécurité, avant d’examiner les principaux modèles de contrôle
d’accès actuellement déployés, notamment RBAC, ABAC, PBAC et CPAC, en évaluant
leurs forces et leurs limites respectives. Cette étude critique permet de justifier le choix
du modèle RBAC pour le développement de notre blueprint JHipster, en tenant compte
des spécificités techniques et fonctionnelles de notre environnement cible.
• L’Intégrité : assure que les données ne sont pas modifiées illégalement et restent
fiables .
9
Fig. 2.1 : La triade CID
Pour répondre à ces enjeux, la sécurité applicative s’impose comme une composante essen-
tielle de la cybersécurité globale. Elle se concentre sur la protection des logiciels, services
et interfaces exposés aux utilisateurs, notamment les applications web et mobiles. Elle
repose sur plusieurs mécanismes complémentaires, tels que :
Ces mécanismes sont mis en œuvre à travers des outils comme les pare-feu applicatifs, les
gestionnaires d’identité, les frameworks de sécurité (comme Spring Security), ou encore
les modèles de contrôle d’accès tels que RBAC, ABAC et PBAC..
10
à certains fichiers que d’autres services ne peuvent pas consulter. Ce modèle est simple à
mettre en œuvre et efficace dans des environnements où les responsabilités sont stables.
Cependant, il devient moins adapté lorsque les besoins d’accès évoluent fréquemment ou
nécessitent une personnalisation fine. [6][7][8][9]
Points clés :
• Adapté aux contextes où les responsabilités des utilisateurs sont bien définies et peu
sujettes à des changements.
11
2.2.4 CPAC (Context-Based Access Control) : Contrôle d’accès basé
sur le contexte
Le CPAC (Context-Based Access Control) accorde ou refuse l’accès en fonction du
contexte de la demande, tel que l’heure, la localisation, le type d’appareil ou le comporte-
ment récent de l’utilisateur. Ce modèle est souvent utilisé en complément des autres pour
renforcer la sécurité en tenant compte des conditions réelles d’utilisation. Il est similaire
à l’ABAC, mais met davantage l’accent sur la dimension contextuelle et en temps réel.
[10][11][13]
Points clés :
12
Control) dans notre blueprint JHipster repose avant tout sur sa facilité de mise en œuvre
et sa pertinence dans des environnements où les rôles sont clairement définis et relative-
ment stables. Dans notre cas, les responsabilités des utilisateurs sont bien établies et peu
évolutives, ce qui rend RBAC particulièrement adapté. Ce modèle assure un bon niveau
de sécurité tout en simplifiant la gestion des permissions. Par ailleurs, il facilite les proces-
sus d’audit et de conformité, éléments essentiels dans notre contexte de développement.
Comme le montre le tableau comparatif 2.1, RBAC se distingue par sa simplicité et sa
robustesse, ce qui en fait une solution éprouvée et fiable, fréquemment utilisée dans des
architectures similaires à la nôtre.
2.5.1 JHipster
JHipster (Java Hipster) est un générateur de code open-source permettant de créer
des applications Web modernes et complètes, basées sur des technologies récentes côté
client et serveur. Il s’appuie sur Yeoman pour la génération de projet et permet de choisir
parmi plusieurs stacks front-end (Angular, React, Vue) et back-end (Spring Boot, Micro-
naut, Quarkus…). JHipster est idéal pour les architectures microservices, car il permet
l’intégration fluide d’outils de gestion de la configuration, de la sécurité et du déploie-
ment. Il prend également en charge nativement les conteneurs et l’orchestration, ce qui
le rend particulièrement adapté aux environnements DevOps. JHipster prend en charge
nativement ou via des blueprints :
13
plus modulaire. La génération inclut aussi les configurations Docker Compose permettant
de lancer l’application localement avec sa base de données et son système de sécurité
14
Fig. 2.3 : Architecture microservice standard
15
adaptée aussi bien au développement qu’à la production, notamment dans les architectures
microservices où la montée en charge et la scalabilité sont essentielles
16
• Fournir des solutions prêtes à l’emploi : Créer des générateurs spécialisés pour des
cas d’usage précis, comme des applications mobiles ou des microservices avec une
stack technologique alternative. [15]
• Kotlin : Substitue le backend Java par Kotlin, en offrant une alternative moderne
et concise pour le développement côté serveur.
• .NET Core : Permet de générer une application serveur en .NET Core en rempla-
cement du backend par défaut basé sur Spring Boot.
• [Link] / NestJS : Propose une architecture backend reposant sur [Link], struc-
turée avec le framework avancé NestJS, conçu pour la modularité et la maintenabi-
lité.
17
• Initializing (Initialisation) : Préparation des données de base et configuration
initiale. Cette étape peut inclure la vérification de dépendances, la lecture de fichiers
de configuration ou la définition d’options par défaut.
• Writing (Création des fichiers) : À cette phase, le blueprint produit les fichiers
du projet. Il génère de nouveaux fichiers, substitue les originaux de JHipster ou
modifie leur contenu selon les spécifications personnalisées.
Dans le blueprint que nous avons développé, nous utilisons la phase postWritingEntities,
appartenant à la phase writing du cycle de génération de JHipster. Cette phase inter-
vient après la création initiale des entités et permet d’injecter automatiquement du code
supplémentaire ou de modifier les fichiers générés sans perturber les étapes précédentes.
Cette approche est particulièrement adaptée pour intégrer la gestion fine des permissions
et des relations spécifiques à notre projet, car elle garantit que les personnalisations sont
appliquées de manière cohérente et maintenable, tout en respectant le cycle standard de
génération.
Conclusion
La confidentialité des applications demeure un défi majeur face à la complexité crois-
sante des systèmes et aux menaces évolutives. Les différentes approches de contrôle d’accès
répondent à des besoins variés, alliant contraintes opérationnelles et exigences de sécurité.
Dans ce contexte, le modèle RBAC s’impose comme une solution pragmatique et efficace,
offrant un équilibre pertinent entre granularité et simplicité de gestion. Son adoption dans
le cadre du blueprint JHipster garantit une intégration fluide et une extensibilité adaptée
aux architectures modulaires, répondant ainsi aux exigences spécifiques de notre projet.
18
Chapitre 3
Introduction
Dans ce chapitre, nous présentons la conception globale de la solution à travers deux
axes complémentaires : d’une part, les exigences fonctionnelles de la solution proposée ;
d’autre part, les contraintes critiques imposées par l’architecture initiale de JHipster. En-
suite, nous décrivons la modélisation UML de la solution à l’aide de plusieurs diagrammes :
diagramme de cas d’utilisation, diagramme de classes et diagrammes de séquences. Cette
approche permet de structurer efficacement le développement et de garantir la cohérence
du blueprint tout au long de son intégration dans un projet JHipster.
• EF1 : La solution doit être pleinement fonctionnelle dans les deux types d’archi-
tectures supportées par JHipster : monolithique et microservice.
• EF2 : Chaque rôle (Authority) doit pouvoir être associé à un ensemble de permis-
sions précises, représentant les actions autorisées sur les ressources métier.
19
microservices via la passerelle. Dans les deux cas, Keycloak est utilisé comme serveur
d’authentification centralisé, assurant la gestion des utilisateurs et de leurs rôles
Bien que ces architectures reposent sur des technologies éprouvées et largement utili-
sées, elles présentent plusieurs limitations importantes en matière de gestion fine des accès
et de sécurité :
• Modèle de sécurité rigide : Le contrôle d’accès se base sur un modèle RBAC simple,
avec des rôles codés en dur. Ce modèle ne permet ni la définition d’une hiérarchie
entre les rôles, ni une granularité au niveau des permissions spécifiques (telles que
VIEW, EDIT, DELETE). Cela limite fortement la capacité à appliquer des poli-
tiques de sécurité précises et adaptées aux différents profils utilisateurs.
20
• Sécurisation des endpoints backend : Le blueprint configure automatiquement
tous les éléments nécessaires à la protection des endpoints REST. Cela englobe la
génération et la modification des classes, des services et des fichiers de configuration,
ainsi que l’application précise des règles liées aux rôles et permissions des utilisa-
teurs. Cette automatisation assure un contrôle d’accès fiable et conforme aux droits
définis.
• Assigner des permissions aux rôles : Accessible via la gestion des rôles, cette
fonctionnalité permet de définir précisément les permissions attachées à chaque rôle.
Après avoir choisi un rôle via l’interface de gestion, l’administrateur peut lui assigner
des permissions spécifiques. Le blueprint prend en charge la génération automatique
des entités, des services, des contrôleurs, ainsi que des interfaces frontend permettant
cette association, garantissant une gestion fine et sécurisée des droits d’accès.
Chaque cas d’utilisation illustre une facette complémentaire de l’automatisation offerte
par le blueprint, qui agit à tous les niveaux de l’application : configuration backend,
sécurisation, adaptation du frontend. L’objectif est clair : fournir une solution clé en main
pour intégrer une gestion fine des permissions, avec un minimum d’effort humain et une
cohérence technique renforcée dans tout le système.
21
suite à l’intégration de notre blueprint JHipster. Il met en évidence le rôle de chaque
composant — du développeur jusqu’au client final — dans la mise en œuvre et l’exécution
de la logique de contrôle d’accès basée sur les rôles et permissions.
• Contrôle des accès : en s’appuyant sur les mécanismes ajoutés par le blueprint, l’ap-
plication analyse le token afin d’identifier les rôles de l’utilisateur, en extrait les
permissions correspondantes, applique la hiérarchie définie, puis vérifie si l’utilisa-
teur possède les droits nécessaires pour accéder à la ressource demandée.
Réponse adaptée :
22
– Sinon, un message d’erreur lui est retourné pour signaler l’absence d’autorisa-
tion suffisante.
23
24
• Transmission au frontend : Une fois les permissions récupérées, elles sont incluses
dans la réponse envoyée au frontend pour adapter dynamiquement les interfaces.
• Accès à une route ou action protégée : lorsqu’un utilisateur interagit avec l’ap-
plication (par exemple, lors d’un clic sur un bouton ou d’une tentative d’accès à
une route), les permissions sont vérifiés afin de s’assurer qu’elles correspondent aux
permissions nécessaires pour effectuer l’action demandée
– Côté frontend : si l’utilisateur n’a pas la permission, l’élément est masqué (ex.
bouton non affiché).
– Côté backend : une fois la requête envoyée, l’application vérifie à nouveau les
rôles et permissions de l’utilisateur via le token d’accès.
• Réponse de l’application :
27
3.4.3 Diagramme de séquence pour la gestion des rôles et des permis-
sions
La figure suivante 3.5 présente un diagramme de séquence décrivant le processus d’in-
teraction entre les différents acteurs et composants dans le cadre de la gestion des rôles
et des permissions dans une application JHipster générée via un blueprint personnalisé.
Ce diagramme met en évidence les étapes allant depuis la génération du code Angular
jusqu’à l’assignation des permissions à un rôle par l’utilisateur via l’interface.
Fig. 3.6 : Diagramme de séquence pour la gestion des roles et des permissions
Ces fichiers font partie d’un ensemble plus large de composants Angular générés par le
blueprint pour couvrir l’intégralité de la logique de gestion des accès. Cette automatisation
permet de standardiser l’implémentation de la sécurité dans l’interface utilisateur et de
réduire considérablement le travail manuel du développeur.
Une fois l’application générée et déployée, l’utilisateur final (administrateur) peut
accéder à l’interface web de gestion :
28
• Lorsque l’utilisateur sélectionne un rôle, il est redirigé vers une nouvelle interface
affichant les permissions associées à ce rôle.
• L’utilisateur peut alors assigner ou retirer des permissions à ce rôle à l’aide d’une
interface intuitive (liste à cocher, boutons, etc.).
• Ces opérations entraînent des appels vers le backend qui modifient la base de données
afin de refléter les nouvelles associations entre rôles et permissions.
• Une confirmation ou un message de succès est ensuite affiché pour valider l’opéra-
tion.
[Link] Remarque :
Le blueprint personnalisé n’a besoin d’être exécuté qu’une seule fois, à n’importe
quel moment du cycle de développement. Une fois appliqué, il injecte automatiquement
l’ensemble de la configuration nécessaire — aussi bien côté frontend que backend — sans
nécessiter d’exécution répétée ni d’intervention manuelle supplémentaire.
Dans le cadre de l’implémentation d’un contrôle d’accès basé sur les rôles (RBAC –
Role-Based Access Control) avec une gestion fine des permissions, le blueprint JHipster
personnalisé ajoute automatiquement deux tables supplémentaires à la base de données :
permission et jhi-authority-permission.
29
La table permission permet de définir des autorisations métier précises, tandis que
la table d’association jhi-authority-permission établit une relation many-to-many
entre les rôles (jhi-authority) et les permissions.
Cette extension du modèle de données permet de dépasser les limites du modèle RBAC
standard de JHipster, qui ne prend en charge que les rôles, en introduisant une granularité
plus fine dans le contrôle d’accès aux fonctionnalités de l’application.
L’ajout de ces tables est entièrement automatisé par le blueprint, garantissant une
génération et une intégration systématiques et cohérentes à chaque création ou mise à
jour d’un microservice ou d’une application monolithique.
Conclusion
Ce chapitre a présenté la conception détaillée de notre solution d’intégration d’un
blueprint JHipster dédié à la gestion fine des rôles et des permissions. À travers les dif-
férents diagrammes UML — cas d’utilisation, séquences, et classes — nous avons illustré
la structure fonctionnelle et technique de notre module, depuis l’automatisation de la
sécurisation du backend jusqu’à l’adaptation dynamique des interfaces frontend.
30
Chapitre 4
Introduction
Ce chapitre met en lumière les principales actions réalisées par le blueprint côté back-
end des applications JHipster. Développé dans le but d’étendre les fonctionnalités stan-
dards de la plateforme, ce module se concentre particulièrement sur les aspects liés à la
sécurité et à la gestion fine des permissions.
Il s’appuie sur une étude comparative entre la configuration de sécurité proposée par
défaut par JHipster et l’architecture enrichie intégrant le blueprint que nous avons conçu.
Les principales évolutions introduites sont détaillées, notamment l’intégration des permis-
sions, la hiérarchisation des rôles, ainsi que la découverte dynamique des microservices
via Consul.
Les sections qui suivent présentent, de manière progressive, la structure, la logique, et
les mécanismes techniques mis en œuvre pour construire une architecture microservices à
la fois sécurisée, cohérente et extensible.
31
Fig. 4.1 : Intégration du Blueprint dans l’architecture microservice
32
Fig. 4.2 : Intégration du Blueprint dans l’architecture monolithique
Ce blueprint agit comme une surcouche intelligente et automatisée, injectant des mé-
canismes avancés de gestion des accès dans l’application générée, tout en respectant la
nature de l’architecture choisie. Il complète et renforce les mécanismes de sécurité stan-
dard de JHipster, en apportant une gestion centralisée, hiérarchisée et dynamique des
rôles et des permissions.
Notre blueprint est capable de détecter automatiquement l’architecture (monolithique
ou microservices) de l’application lors de sa génération, et d’adapter dynamiquement les
fichiers générés et modifiés pour assurer une sécurité fine, cohérente et homogène.
Les principales contributions introduites par le blueprint dans ces nouvelles architec-
tures enrichies sont les suivantes :
33
• Récupération dynamique des permissions (pour les microservices) : dans cette ar-
chitecture enrichie, le Gateway interroge Consul pour découvrir dynamiquement les
microservices actifs, puis utilise WebClient pour accéder aux endpoints sécurisés de
chaque service. Cela permet de centraliser la collecte des permissions de l’utilisateur
sans compromettre le découplage entre les services.
Fig. 4.3 : carte mentale : action du blueprint sur le backend des applications
34
• Les fichiers modifiés : il s’agit de fichiers existants dans l’ossature standard d’un
projet JHipster. Leur contenu est automatiquement ajusté par notre blueprint à
l’aide de fonctions personnalisées que nous avons développées. Ces fonctions per-
mettent d’y insérer dynamiquement les éléments de sécurité nécessaires (relations
entités-permissions, annotations de protection, logique d’authentification, etc.), sans
modifier manuellement le code généré de base.
• config/
• repository/
– [Link],[Link] : Re-
positories que nous avons développés pour assurer la persistance des entités de
sécurité. Leur logique respecte le modèle JpaRepository (pour monolithes et
microservices) ou R2dbcRepository (pour le gateway).
• web/rest/
• service/
35
– [Link] : Service généré uniquement dans les microservices,
qui permet uniquement de récupérer les autorités (rôles) de l’utilisateur.
– [Link] : Service métier généré pour gérer les opérations
CRUD sur les permissions et leurs associations avec les rôles.
• service/dto/
• resources/config/liquibase/
• config/
• web/rest/
• config/
• domain/
• service/
36
• resources/config/liquibase/
JHipster, dans sa configuration standard, gère les accès par rôles via l’entité Autho-
rity. Cependant, cette approche reste relativement limitée, car elle ne permet pas de
distinguer les droits précis sur les opérations (ex. : un rôle ADMIN a tous les droits,
mais un rôle USER ne peut pas avoir l’accès aux opérations de suppression). D’où la
nécessité d’introduire un modèle de permissions dynamiques, plus granulaire, pour
affiner le contrôle d’accès.
• Approche choisie :
Pour répondre à ce besoin, nous avons enrichi le modèle RBAC classique de JHipster
par une nouvelle entité : Permission. Cette entité est associée aux rôles (Authority)
et définit des droits spécifiques sur des opérations CRUD appliquées à des entités
métier.
Cette granularité permet de définir avec précision qui peut faire quoi sur quelles
ressources.
Cette architecture est intégralement automatisée grâce à notre blueprint jhipster,
lequel
37
– Crée une hiérarchie logique et facilement modifiable entre les permissions.
38
5 public static RoleHierarchy roleHierarchy () {
6 StringBuilder roleHierarchy = new StringBuilder ();
7 roleHierarchy
8 . append ( AuthoritiesConstants . ADMIN )
9 . append (" > ")
10 . append ( RoleConstants . MODEL_DELETE )
11 . append (" > ")
12 . append ( RoleConstants . MODEL_CREATE )
13 . append (" > ")
14 . append ( RoleConstants . MODEL_UPDATE )
15 . append (" > ")
16 . append ( RoleConstants . MODEL_READ )
17 . append ("\n");
18 return
RoleHierarchyImpl . fromHierarchy ( roleHierarchy . toString ());
19 }
20 }
Listing 4.1: Classe [Link]
Ce fichier est également généré automatiquement. À chaque ajout d’entité, les nouvelles
permissions sont intégrées dans la hiérarchie définie, assurant ainsi une mise à jour cohérente
et continue du modèle de sécurité.
c) Modification de l’entité Authority : (Pour les microservices et les
applications monolithique)
La classe [Link] est modifiée automatiquement pour ajouter la relation
@ManyToMany avec les permissions, permettant ainsi l’association d’un rôle
à plusieurs permissions
d) Génération des fichiers Liquibase Pour maintenir la structure de la base de
données à jour, le blueprint produit automatiquement les fichiers de migration
Liquibase correspondants
– [Link] : création de la table permission,
– [Link] : création de la table d’association entre au-
thority et permission,
– [Link] : mise à jour automatique pour inclure ces nouveaux fichiers.
e) Sécurisation automatique des endpoints REST : Le blueprint analyse
automatiquement tous les contrôleurs REST (*[Link]) et injecte l’an-
notation @PreAuthorize sur les méthodes exposées selon la convention :
– La permission est calculée dynamiquement en fonction de l’entité (ex :
Product) et de l’action (CRUD).
1 @PostMapping ("")
2 public ResponseEntity < ProduitDTO > createProduit (
3 @RequestBody ProduitDTO produitDTO )
39
4 throws URISyntaxException {
5 LOG. debug("REST request to save Produit : {}", produitDTO );
6 if ( produitDTO . getId () != null) {
7 }
1 @PostMapping ("")
2 @PreAuthorize (" hasAuthority ('" + RoleConstants . PRODUIT_CREATE + " ')")
3 public ResponseEntity < ProduitDTO > createProduit ( @RequestBody
ProduitDTO produitDTO ) throws URISyntaxException {
4 LOG. debug("REST request to save Produit : {}", produitDTO );
5 }
Cette automatisation assure une cohérence dans la sécurisation des endpoints sur l’ensemble du
système. Grâce à la génération dynamique des annotations @PreAuthorize, le développeur n’a
plus besoin d’ajouter manuellement des règles de sécurité spécifiques : elles sont injectées selon
une convention standardisée, garantissant ainsi une gouvernance centralisée et fine des droits
d’accès.
f) Intégration dynamique des permissions dans le contexte de sécurité :
gateway, microservices et monolithique
Afin d’intégrer de manière dynamique les autorisations dans le cadre de la
sécurité Spring Security, des ajustements ont été réalisés sur les fonctions res-
ponsables de la conversion des tokens JWT. Ces modifications varient selon
qu’elles s’appliquent au niveau du gateway , des microservices ou d’application
monolithique . Cette approche permet d’ajouter automatiquement aux rôles
(Authorities) de l’utilisateur les permissions correspondantes dès son authen-
tification, assurant ainsi une gestion précise et évolutive des droits d’accès.
(a) Modification côté gateway : Dans le gateway, la gestion de l’authenti-
fication repose sur le protocole OpenID Connect (OIDC) avec un flux ré-
actif. La méthode principale modifiée est le bean oidcUserService() définie
dans le fichier [Link], qui personnalise la conversion
du token utilisateur OIDC. Cette méthode procède en plusieurs étapes :
– Elle charge l’utilisateur à partir du token OIDC via un service délégué
standard.
– Elle extrait les rôles (Authorities) définis dans les claims du token en
parcourant les autorités OIDC.
– Grâce aux modifications injectées par le blueprint. elle enrichit ensuite
ces rôles avec les permissions dynamiques associées en appelant la mé-
thode addPermissionsToAuthorities(). Celle-ci appele la methode
getPermissionsForAuthorities qui interroge de manière réactive la
base de données afin de récupérer les permissions liées aux rôles via
des relations Authority-Permission.
40
– La hiérarchie des rôles est appliquée pour prendre en compte les héri-
tages et étendre les droits de l’utilisateur.
– Un nouvel objet DefaultOidcUser est ensuite généré avec l’ensemble
des autorités complétées, garantissant que le SecurityContext dispose
de toutes les permissions nécessaires.
1 @Bean
2 public ReactiveOAuth2UserService < OidcUserRequest , OidcUser >
oidcUserService ( RoleHierarchy roleHierarchy ) {
3 final OidcReactiveOAuth2UserService delegate = new
OidcReactiveOAuth2UserService ();
4
5 return userRequest -> {
6 return delegate
7 . loadUser ( userRequest )
8 . flatMap (user -> {
9 Set < GrantedAuthority > baseAuthorities = new HashSet < >();
10 // Extraction des rôles ( authorities ) présents dans les
claims du token OIDC
11 user. getAuthorities (). forEach ( authority -> {
12 if ( authority instanceof OidcUserAuthority oidcAuth ) {
13 baseAuthorities . addAll (
14 SecurityUtils
15 . extractAuthorityFromClaims (
16 oidcAuth . getUserInfo (). getClaims ()));
17 }
18 });
19 // Ajout asynchrone des permissions associées aux rôles extraits
20 return addPermissionsToAuthorities ( baseAuthorities ).
21 map( grantedAuthorities -> {
22 Collection <? extends GrantedAuthority >
allAuthoritiesWithHierarchy = roleHierarchy .
23 getReachableGrantedAuthorities ( grantedAuthorities );
24 return new DefaultOidcUser (
25 new HashSet <>( allAuthoritiesWithHierarchy ),
26 user. getIdToken () ,
27 user. getUserInfo () ,
28 PREFERRED_USERNAME
29 );
30 });
31 });
32 };
33 }
Listing 4.4: Intégration des permissions coté gateway
En complément de cette méthode principale Listing 4.4 que nous avons
modifiée, elle fait également appel à d’autres méthodes, développées
et intégrées via le blueprint, qui sont :
∗ addPermissionsToAuthorities(Collection<GrantedAuthority>
41
authorities) : Cette méthode prend la collection initiale des rôles
(Authorities) extraits du token et, de manière réactive, récupère
toutes les permissions associées à ces rôles. Elle fusionne ensuite ces
permissions aux rôles existants pour produire une collection enrichie
qui sera utilisée dans le contexte de sécurité.
∗ getPermissionsForAuthorities(Set<String> authorityNames) :
Cette méthode interroge de façon asynchrone la base de données
pour chaque rôle (authority) reçu, via la relation entre Authority
et Permission. Elle récupère l’ensemble des permissions associées à
ces rôles, élimine les doublons, et retourne un flux réactif des per-
missions. Cette méthode est appelée par addPermissionsToAutho-
rities() pour obtenir la liste précise des permissions à ajouter.
(b) Modification côté Microservice : Dans les microservices, l’authenti-
fication via JWT est gérée de manière synchrone. La fonction modifiée
est la méthode authenticationConverter() du fichier SpringConfigura-
[Link] , qui retourne un convertisseur de type Converter<Jwt, Abs-
tractAuthenticationToken>. Cette méthode réalise les opérations sui-
vantes :
– Elle utilise un convertisseur JWT standard (JwtAuthenticationCon-
verter) pour extraire les rôles de l’utilisateur à partir des claims du
token.
– Grâce aux modifications injectées par le blueprint. elle surcharge le
convertisseur d’autorités pour appeler la méthode addPermissions-
ToAuthorities(), laquelle enrichit la liste initiale des rôles par les
permissions correspondantes.
– La récupération des permissions s’effectue directement via le reposito-
ry PermissionRepository en interrogeant la base de données selon les
noms des rôles via la méthode getPermissionsForAuthorities.
Cet enrichissement des autorités est effectué avant la création du token
d’authentification Spring Security, ce qui garantit que le SecurityCon-
text est correctement alimenté.
1 Converter <Jwt , AbstractAuthenticationToken > authenticationConverter ()
{
2 JwtAuthenticationConverter jwtAuthenticationConverter = new
JwtAuthenticationConverter ();
3 jwtAuthenticationConverter . setJwtGrantedAuthoritiesConverter (
4 new Converter <Jwt , Collection < GrantedAuthority > >() {
5 @Override
6 public Collection < GrantedAuthority > convert (Jwt jwt) {
7 Collection < GrantedAuthority > authorities =
8 SecurityUtils .
9 extractAuthorityFromClaims (jwt. getClaims ());
10 // Enrichissement des autorités avec les permissions
associées
11 return addPermissionsToAuthorities ( authorities );
12 }
42
13 }
14 );
15 setPrincipalClaimName ( PREFERRED_USERNAME );
16 return jwtAuthenticationConverter ;
17 }
Listing 4.5: Intégration des permissions coté microservice
En plus de cette méthode présentée dans le Listing (4.5) que nous avons
modifiée et qui est la méthode principale, elle fait appel à d’autres mé-
thodes que nous avons développées et injectées par le blueprint, qui sont :
– addPermissionsToAuthorities(Collection<GrantedAuthority>
authorities) : Cette méthode est responsable d’enrichir dynamique-
ment les rôles extraits du token JWT. Elle prend en entrée la collection
des autorités (rôles) initialement fournies par le convertisseur JWT,
puis identifie les permissions associées à ces rôles. Après avoir récupéré
ces permissions, elle les convertit en objets de type GrantedAuthority
et les ajoute à la collection existante. Cette liste enrichie, composée à
la fois des rôles et des permissions, est ensuite utilisée pour construire
le SecurityContext de Spring Security, assurant une gestion plus fine
des droits.
– getPermissionsForAuthorities(Set<String> authorityNames) :
Cette méthode est appelée en interne par la précédente. Elle interroge
la base de données à partir des noms de rôles reçus, en s’appuyant sur
la relation définie entre les entités Authority et Permission. Son objec-
tif est de retourner toutes les permissions liées à ces rôles sous forme
d’un ensemble unique, sans doublons. Ces permissions sont ensuite
exploitées pour alimenter la collection finale des autorités, intégrant
ainsi les droits granulaires nécessaires à la sécurisation des endpoints
ou de l’interface utilisateur.
Cette solution permet de combiner efficacement les rôles et les permissions
lors de l’authentification, assurant ainsi une gestion fine et centralisée des
accès dans chaque microservice. Elle garantit que toutes les autorisations
nécessaires sont disponibles dès l’établissement du contexte de sécurité,
renforçant la fiabilité du mécanisme de contrôle d’accès.
(c) Modification côté Monolithique Dans les applications monolithique,
la modification principale se situe dans la méthode getUserFromAuthen-
tication() de la classe [Link]. Cette méthode réalise les opé-
rations suivantes :
– Elle récupère les rôles extraits du token d’authentification OAuth2 ou
JWT.
– Elle appelle la méthode getPermissionsByAuthorities(Set<String>
authorities) du service PermissionService, laquelle interroge la base
de données via le repository pour obtenir toutes les permissions asso-
ciées à ces rôles.
– Elle convertit ces permissions en objets GrantedAuthority de Spring
43
Security, puis les ajoute à la collection initiale des rôles.
– Elle crée une nouvelle instance d’Authentication enrichie des rôles et
des permissions, et met à jour le SecurityContextHolder avec ce nouvel
objet. Cela permet à toute l’application d’accéder à un contexte de
sécurité qui intègre les rôles et les permissions, facilitant la gestion
fine des droits d’accès via les annotations @PreAuthorize et directives
Angular.
• Approche choisie :
L’approche retenue repose sur les composants suivants :
44
a) Génération automatique du service DynamicCallerService : Le blue-
print génére automatiquement au sein du gateway un service nommé Dynamic-
CallerService chargé de communiquer avec Consul pour identifier les microser-
vices en cours d’exécution. Ce service filtre les services inutiles, notamment le
gateway, et récupère les adresses réseau des microservices [Link] opéra-
tion est cruciale pour assurer que le gateway puisse détecter automatiquement
tous les microservices actifs, quelle que soit leur configuration ou leur quantité.
Ce service repose sur deux méthodes principales :
– La méthode getMicroservices() interroge Consul afin d’obtenir la liste
complète des services enregistrés, élimine ceux qui ne sont pas nécessaires,
puis pour chaque service filtré, elle fait appel à getServiceAddressesBy-
Name() pour récupérer leurs adresses réseau complètes (IP et port). Les
différentes adresses obtenues sont ensuite fusionnées en une liste unique et
exploitable.
– La méthode getServiceAddressesByName() joue un rôle crucial dans
la découverte dynamique des services auprès de Consul. Pour chaque ser-
vice interrogé, elle récupère les informations détaillées des différentes ins-
tances enregistrées, notamment leurs adresses IP et leurs ports. Ensuite,
elle traite ces données pour filtrer les adresses invalides ou incomplètes,
telles que les entrées vides ou par défaut, afin d’assurer la qualité des infor-
mations utilisées. Par ailleurs, elle élimine les doublons pour ne conserver
qu’un ensemble unique d’adresses réseau valides et exploitables. Cette mé-
thode permet ainsi de fournir une liste propre et fiable des points d’accès
à chaque microservice, facilitant la communication entre composants dans
une architecture distribuée.
1 public Mono <List <String >> getMicroservices () {
2 WebClient webClient =
webClientBuilder . baseUrl ("http :// localhost :8500 "). build ();
3 return webClient
4 .get ().uri("/v1/ catalog / services "). retrieve ()
5 . bodyToMono (new ParameterizedTypeReference <Map <String ,
Object >>() {})
6 . flatMap ( services -> {
7 List <String > microservices = services . keySet (). stream ()
8 . filter ( serviceName ->
! serviceName . equalsIgnoreCase (" gateway "))
9 . collect ( Collectors . toList ());
10 List <Mono <List <String >>> addressMonos = microservices
11 . stream ()
12 .map( serviceName ->
getServiceAddressesByName ( serviceName ))
13 . collect ( Collectors . toList ());
14 return [Link]( addressMonos , results -> {
15 List <String > allAddresses = new ArrayList < >();
16 for ( Object result : results ) {
17 allAddresses . addAll (( List <String >) result );
45
18 }
19 return allAddresses ;
20 });
21 });
22 }
Listing 4.6: Détection et agrégation des adresses des microservices
enregistrés dans Consul.
46
12 . onErrorResume ( error -> {
13 System .err. println (" Erreur lors de l'appel à " +
url + ": " + error . getMessage ());
14 return Mono. empty ();
15 });
16 })
17 . collectList ()
18 . flatMap ( responses -> {
19 Set <String > allAuthorities = new HashSet < >();
20 for ( String response : responses ) {
21 Set < PermissionDTO > permissions =
parsePermissionsFromResponse ( response );
22 allAuthorities . addAll ( permissions . stream ()
23 .map( PermissionDTO :: getName )
24 . collect ( Collectors . toSet ()));
25 }
26 return [Link]( allAuthorities );
27 });
28 }
29 }
Listing 4.7: Méthode responsable de récupérer des permissions
• Approche choisie :
L’approche adoptée repose sur la configuration automatique des clients Feign, uti-
lisés dans les microservices pour effectuer des appels HTTP vers d’autres services.
Ces clients doivent être capables d’inclure un jeton d’accès valide dans chaque re-
quête sortante, généré à partir des informations de configuration Keycloak déjà
disponibles dans l’environnement JHipster. De plus, il est nécessaire que le gateway
puisse reconnaître ce jeton pour autoriser ces appels. Pour cela, une configuration
complémentaire est injectée dans le fichier [Link], afin de définir le scope
adéquat pour les communications internes.
47
les paramètres requis pour l’obtention d’un jeton OAuth2 à l’aide du mé-
canisme client-credentials. Cette classe analyse la propriété issuer-uri afin
d’en déduire dynamiquement l’URL du serveur d’authentification Keycloak
ainsi que le nom du realm, puis construit l’URL d’accès au point d’émission
de [Link] fois la configuration établie, une requête d’authentification est
initiée via WebClient afin de récupérer un jeton d’accès. Le mécanisme repose
sur l’utilisation de WebClient pour initier une demande d’authentification, à
l’issue de laquelle un jeton d’accès est obtenu. Ce jeton est ensuite automati-
quement attaché aux en-têtes des requêtes émises via Feign, par le biais d’un
intercepteur dédié, garantissant ainsi l’envoi sécurisé des appels interservices
sans intervention manuelle.
b) Modification du fichier jhipster-realm En complément, le blueprint mo-
difie automatiquement le fichier [Link] du gateway pour y ajouter
le scope jhipster aux defaultClientScopes du client interne. Cette modifica-
tion garantit que les jetons générés contiennent bien les droits nécessaires à
l’authentification des appels interservices via la passerelle, assurant ainsi une
communication centralisée, sécurisée et cohérente à travers l’ensemble de l’éco-
système microservices.
Conclusion
Ce chapitre a permis d’établir les fondements nécessaires à la compréhension du blue-
print que nous avons conçu, en mettant en évidence les limites des mécanismes standards
proposés par JHipster pour la gestion des rôles et des permissions. Grâce à une démarche
progressive, nous avons présenté en détail les principales améliorations apportées côté ba-
ckend, dans le but d’offrir une gestion des accès plus granulaire, dynamique et sécurisée.
48
Chapitre 5
Introduction
Dans la continuité des optimisations réalisées côté backend, ce chapitre se concentre
sur les configurations automatisées par le blueprint au niveau du frontend. L’objectif est
d’assurer une correspondance rigoureuse entre les rôles, les permissions et les éléments
de l’interface utilisateur, tout en garantissant une expérience fluide, sécurisée et adaptée
aux droits de chaque utilisateur. Nous détaillons les fichiers Angular générés ou modifiés
automatiquement, ainsi que la logique conditionnelle mise en place pour adapter dynami-
quement l’affichage en fonction des permissions attribuées. Ce chapitre met également en
lumière les actions de maintenance appliquées à la gestion de la confidentialité, automa-
tisées par le blueprint, dans le but d’améliorer les performances globales des applications
générées.
49
Fig. 5.1 : carte mentale : action du blueprint sur frontend des applications JHipster
• Les fichiers générés : sont un ensemble de templates que nous avons créés au sein
du blueprint. Ils permettent la génération automatique des fichiers dans l’applica-
tion, en s’adaptant au type d’architecture (monolithique, microservices, gateway).
• Les fichiers modifiés : sont ceux déjà présents dans la structure standard de
JHipster. Grâce à des fonctions JavaScript spécifiques développées dans le blueprint,
ces fichiers sont automatiquement mis à jour pour intégrer les éléments de sécurité
nécessaires, sans intervention manuelle sur le code source.
• constant
• route
• component :
50
– [Link] [Link]
Composant Angular dynamique utilisé pour sélectionner les permissions à at-
tribuer à un rôle. Il intervient dans les interfaces de création et modification
des rôles.
• service
• model
• component
– [Link]
– [Link] Interface complète pour gérer les rôles
locaux d’un microservice, et leur association avec des permissions spécifiques
à ce microservice.
• route
• route :
• component
– [Link] L’affichage
des boutons d’action (édition, suppression, etc.) est conditionné par les per-
missions de l’utilisateur grâce à la directive personnalisée hasAnyAuthority.
• service d’authentification
51
• module partagés
• component
Or, le mécanisme standard de JHipster repose uniquement sur des rôles globaux
(Authorities), ce qui limite la granularité des permissions.
• Approche choisie :
Le blueprint jhipster que nous avons développé propose une approche automatisée et
granulaire de la personnalisation des interfaces Angular, en fonction des permissions
propres à chaque [Link] repose sur :
52
– La génération automatisée de fichiers TypeScript dédiés à la centralisation des
rôles et des permissions ;
– L’adaptation des services Angular afin d’y intégrer une logique de hiérarchie
des permissions, permettant une gestion étendue des autorisations ;
– L’injection dynamique de directives dans les fichiers HTML, pour contrôler
l’affichage des composants selon les droits de l’utilisateur ;
– La sécurisation contextuelle des routes Angular, assurant une restriction fine
de l’accès aux pages en fonction des permissions.
53
∗ Les autorités fournies directement par le backend via le ga-
teway, qui comprennent à la fois :
· les rôles classiques (comme ROLE-ADMIN, ROLE-USER),
· les permissions spécifiques, ajoutées dynamiquement grâce aux ser-
vices UserService et PermissionService.
∗ Les autorisations complémentaires calculées localement dans
le frontend, basées sur une hiérarchie des permissions. Cette hié-
rarchie permet d’étendre automatiquement les droits de l’utilisateur
en lui attribuant aussi les permissions inférieures associées, selon un
principe d’héritage.
– getExpandedAuthorities() Cette méthode applique la logique d’héri-
tage hiérarchique. Elle s’appuie sur un fichier de configuration(role-hierarchy-
[Link]) dans lequel chaque permission est associée à une valeur nu-
mérique représentant son niveau d’autorité.
Fonctionnement :
∗ Une permission avec une valeur élevée est considérée comme plus puis-
sante.
∗ Lorsqu’un utilisateur détient une permission donnée, toutes celles de
niveau inférieur ou équivalent lui sont automatiquement attribuées.
Ce mécanisme assure une cohérence fonctionnelle : il serait illogique qu’un
utilisateur ait le droit de supprimer une entité sans pouvoir la consulter.
– hasAnyAuthority()(authorities : string[] | string) : La méthode ha-
sAnyAuthority() a été réécrite afin de tirer parti de la logique d’autorités
enrichies. Plutôt que de se baser uniquement sur les autorités renvoyées
par le backend, elle utilise désormais la liste complète construite par ge-
tAuthoritiesWithHierarchy(), intégrant à la fois les permissions explicites
et celles obtenues par héritage. Elle permet de déterminer de manière
fiable si un utilisateur possède une autorité ou une permission, qu’elle soit
directement attribuée ou héritée, afin de gérer dynamiquement l’accès à
certaines fonctionnalités ou éléments de l’interface Angular (notamment
via la directive hasAnyAuthority)
1 hasAnyAuthority ( authorities : string [] | string ): boolean {
2 const userIdentity = this. userIdentity ();
3 if (! userIdentity ) {
4 return false ;}
5 const expandedAuthorities = this. getAuthoritiesWithHierarchy ();
6 if (! Array. isArray ( authorities )) {
7 authorities = [ authorities ]; }
8 return authorities .some( required =>
expandedAuthorities .has( required ));}
9 getExpandedAuthorities ( authorities : string []): Set <string > {
10 const allAuthorities = new Set <string >();
11 const isAdmin = authorities . includes ('ROLE_ADMIN ');
12 if ( isAdmin ) {
13 Object . values ( ROLE_WEIGHT ). forEach ( enumRole => {
54
14 Object .keys( enumRole ). forEach (role => allAuthorities .add(role));
15 });
16 allAuthorities .add('ROLE_ADMIN ');
17 return allAuthorities ;
18 }
19 authorities . forEach ( userRole => {
20 const parts = userRole . split ('_');
21 if (parts. length >= 3) {
22 const entity = parts [1];
23 const enumRole = ROLE_WEIGHT [ entity ];
24 if ( enumRole ) {
25 const currentWeight = ( enumRole as Record <string ,
number >)[ userRole ] ?? 0;
26 Object . entries ( enumRole as Record <string ,
number >). forEach (([ role , weight ]) => {
27 if ( currentWeight >= weight ) {
28 allAuthorities .add(role);
29 }
30 });
31 }
32 }
33 });
34 return allAuthorities ;
35 }
36 getAuthoritiesWithHierarchy (): Set <string > {
37 const account = this. userIdentity ();
38 if (! account || ! account . authorities ) {
39 return new Set ();
40 }
41 return this. getExpandedAuthorities ( account . authorities );
42 }
Listing 5.2: les Modifications effectuées sur le fichier
[Link]
55
sentiel que cette méthode fournisse des données enrichies et cohérentes.
Pour cette raison, la méthode getUserFromAuthentication() du fichier
[Link] a été redéfinie comme illustrée dans le Listing 5.3 auto-
matiquement au niveau du gateway. Elle constitue la base du traitement
de l’appel /api/account, et son adaptation permet d’ajouter dynamique-
ment les permissions aux autorités utilisateur classiques. Cela garantit que
toutes les interfaces frontend disposent d’une vision complète et actualisée
des droits de l’utilisateur, sans avoir à effectuer des requêtes supplémen-
taires vers d’autres services.
1
2 @Transactional
3 public Mono < AdminUserDTO >
getUserFromAuthentication ( AbstractAuthenticationToken authToken ) {
4 Map <String , Object > attributes ;
5 if ( authToken instanceof OAuth2AuthenticationToken ) {
6 attributes = (( OAuth2AuthenticationToken )
authToken ). getPrincipal (). getAttributes ();
7 } else if ( authToken instanceof JwtAuthenticationToken ) {
8 attributes = (( JwtAuthenticationToken )
authToken ). getTokenAttributes ();
9 } else {
10 throw new IllegalArgumentException (" AuthenticationToken is
not OAuth2 or JWT!");
11 }
12 User user = getUser ( attributes );
13 extrayant du token
14 user. setAuthorities (
15 authToken
16 . getAuthorities ()
17 . stream ()
18 .map( GrantedAuthority :: getAuthority )
19 .map( authority -> {
20 Authority auth = new Authority ();
21 auth. setName ( authority );
22 return auth;
23 })
24 . collect ( Collectors . toSet ())
25 );
26 return syncUserWithIdP ( attributes , user)
27 . flatMap (u -> {
28 AdminUserDTO adminUserDTO = new AdminUserDTO (u);
29 return permissionService . extractToken ( authToken )
30 . flatMap ( token ->
31 permissionService
32 . getPermissionsFromMicroservice (token ,
u. getAuthorities (). stream ()
33 .map( Authority :: getName )
34 . collect ( Collectors . toSet ()))
56
35 . flatMap ( permissions -> {
36 adminUserDTO . getAuthorities ()
37 . addAll ( permissions );
38 return [Link]( adminUserDTO );
39 })
40 permissions , affiche un message et retourne le
DTO sans permissions additionnelles
41 . onErrorResume (e -> {
42 System .out. println (" Error fetching
permissions for user " + u. getEmail () + ":
" + e. getMessage ());
43 return [Link]( adminUserDTO );
44 })
45 );
46 });
47 }
Listing 5.3: Modification appliquée par le blueprint sur [Link]
du gateway
Avant le Bluepirnt :
Dans le listing 5.4, le bouton n’est pas protégé par une directive de contrôle
d’accès ; par conséquent, il est visible par tous les utilisateurs, quels que soient
leurs rôles ou permissions.
1 <a
2 [ routerLink ]="['/ microservices2 /model ', model .id , 'edit ']"
3 class ="btn btn - primary btn -sm"
4 data -cy=" entityEditButton ">
5 <span class ="d-none d-md - inline "
jhiTranslate =" entity . action .edit">Edit </ span >
6 </a>
Listing 5.4: Exemple d'un élément d'action avant l'application du
blueprint
57
Après le Bluepirnt :
avant le Bluepirnt :
Le listing 5.6 montre que la route n’est protégée que par une authentification
générale, sans filtrage par permission, ce qui la rend accessible à tout utilisateur
connecté.
1 {
2 path: ':id/view ',
3 loadComponent : () =>
import ('./ detail /model - detail . component ').then(m =>
m. ModelDetailComponent ),
4 },
Après le Bluepirnt
: Le listing 5.7 montre que la route est désormais sécurisée par une vérification
explicite des permissions via l’attribut authorities, ce qui garantit que seuls les
utilisateurs disposant de la permission convenable peuvent y accéder.
58
1 {
2 path: ':id/view ',
3 data: { authorities : [ ROLE_MODEL [ ROLE_MODEL . ROLE_MODEL_READ ]] },
4 loadComponent : () =>
import ('./ detail /model - detail . component ').then(m =>
m. ModelDetailComponent ),
5 },
• Approche choisie :
59
– Cas de gestion des roles propre au gateway et les architectures mo-
nolithique : Concernant la gestion des rôles au sein du gateway ainsi que dans
l’architecture monolithique, aucune génération de fichiers supplémentaires n’a
été nécessaire. En effet, JHipster fournit déjà une interface d’administration
des rôles complète et fonctionnelle via l’écran standard lié à l’entité Authority.
Toutefois, deux modifications ciblées ont été apportées afin d’intégrer l’inter-
face de gestion des permissions par rôle :
∗ Le fichier [Link] a été modifié pour ajouter un bou-
ton en face de chaque rôle, permettant d’accéder à l’interface de gestion
des permissions associées à ce rôle.
∗ Le fichier [Link] a été enrichi par l’ajout d’une route pointant
vers cette nouvelle interface.
• Automatisations réalisées par le blueprint Le blueprint développé permet
d’automatiser la création des composants indispensables à la gestion des rôles propre
à chaque microservice , aussi bien côté gateway que sur les microservices.
60
– Points à noter :
∗ La personnalisation de l’apparence et du design de l’interface utilisateur
n’est pas prise en charge par le blueprint. Cette tâche reste sous la respon-
sabilité du développeur, qui adapte l’interface aux besoins et à la charte
graphique du projet.
– Frontend :
∗ [Link] : Ce fichier, produit au-
tomatiquement, fournit le modèle HTML qui permet de visualiser et de
modifier les permissions liées à chaque rôle, offrant ainsi une interface uti-
lisateur claire et facile à utiliser.
∗ [Link] : Ce fichier est automatique-
ment créé pour gérer la logique Angular du composant, incluant la récu-
pération des permissions depuis le backend ainsi que la gestion des modi-
fications utilisateurs.
∗ [Link] : Ce service Angular, généré par
le blueprint, gère la communication avec les endpoints REST du backend,
facilitant l’échange des données liées aux permissions.
∗ [Link] : Ce fichier, généré automatique-
ment, configure la route Angular sécurisée permettant d’accéder au com-
posant de gestion des permissions.
∗ L’injection de cette route est automatisée dans le fichier global enti-
[Link] (microservices) ainsi que la mise à jour correspondante du
routing dans [Link] (gateway et monolithique), assurant une
intégration fluide et transparente dans l’architecture frontend existante.
– Backend :
La classe RolePermissionResource est créée automatiquement par le blueprint,
exposant les endpoints REST dédiés à l’assignation et à la désassignation des
permissions aux rôles.
61
5.3 Maintenance évolutive
62
complètes nécessaires pour appliquer un contrôle d’accès fin et dynamique, sans
dépendance extérieure.
– *-[Link] : Ce fichier, que le blueprint génére automatiquement
pour chaque microservice, hérite d’un service [Link] généré grâce
à JHipster par défaut précédemment utilisé pour interroger un endpoint du
gateway. Dans cette nouvelle approche, il est redéfini pour interagir directement
avec le backend local du microservice. Son rôle est de récupérer les informations
de l’utilisateur connecté — telles que les données personnelles, les rôles et les
permissions — sans passer par le gateway. Cela permet une récupération plus
rapide et allège la charge réseau, tout en renforçant l’indépendance des micro-
frontends.
– *-[Link] Ce service, généré automatiquement, étend
le service standard [Link] et s’appuie sur le nouveau account-
[Link]. Il contrôle l’accès aux routes Angular du microservice en fonction
des permissions et rôles de l’utilisateur, garantissant une sécurisation fine et
adaptée des différentes vues et fonctionnalités.
– Directive Angular personnalisée : Une directive spécifique est générée
automatiquement pour chaque microservice et reliée au nouveau service user-
[Link]. Elle permet d’adapter dynamiquement l’affichage des
éléments de l’interface (comme les boutons ou actions) en fonction des per-
missions de l’utilisateur actuellement connecté. Cette directive garantit une
gestion fine des droits d’accès tout en offrant une interface utilisateur cohé-
rente et sécurisée.
63
3 },
Fonctionnement :
Lorsqu’un utilisateur authentifié tente d’accéder à une ressource ou d’exé-
cuter une action protégée, le CustomPermissionEvaluator intervient pour
vérifier s’il possède la permission nécessaire. Le processus suit plusieurs
étapes :
· Récupération des rôles : Le composant extrait les rôles attribués à
l’utilisateur depuis le contexte de sécurité.
64
· Recherche des permissions associées : À partir de ces rôles, il interroge
la base de données pour récupérer toutes les permissions métier expli-
citement liées à ces rôles. Ces permissions sont souvent plus granulaires
et spécifiques que les simples rôles.
· Application de la hiérarchie métier des permissions : Afin de prendre
en compte les relations d’inclusion entre permissions, CustomPermis-
sionEvaluator utilise une hiérarchie métier définie dans PermissionHie-
rarchy. Cette étape enrichit donc la liste des permissions en ajoutant
toutes celles qui sont implicitement accordées par la hiérarchie.
· Enfin, le composant contrôle si la permission spécifiée dans l’annota-
tion @PreAuthorize est bien incluse dans l’ensemble enrichi des per-
missions. Cette vérification est effectuée par l’appel à la méthode has-
Privilege()
1 @Component (" customPermissionEvaluator ")
2 public class CustomPermissionEvaluator {
3 private final PermissionRepository permissionRepository ;
4
5 public CustomPermissionEvaluator ( PermissionRepository
permissionRepository ) {
6 this. permissionRepository = permissionRepository ;
7 }
8 public boolean hasPrivilege ( String permission ) {
9 if ( permission == null) {
10 return false ;
11 }
12 var authentication =
SecurityContextHolder . getContext (). getAuthentication ();
13 String permissionToCheck = permission . toLowerCase ();
14 Set <String > roles = authentication . getAuthorities (). stream ()
15 .map( GrantedAuthority :: getAuthority ). collect ( Collectors
16 .toSet ());
17 Set <String > permissionsFromDb = permissionRepository
18 . findByAuthoritiesNameIn ( roles )
19 . stream ()
20 .map(p -> p. getName (). toLowerCase ())
21 . collect ( Collectors . toSet ());
22 Set <String > enrichedPermissions =
PermissionHierarchy . enrichPermissions ( permissionsFromDb );
23 return enrichedPermissions . contains ( permissionToCheck );
24 }
25 }
Listing 5.10: Classe CustomPermissionEvaluator générée par le Blueprint
65
la nouvelle version, comme illustré dans le Listing 5.11 :
1 @PreAuthorize (" @customPermissionEvaluator
2 . hasPrivilege (' ROLE_PRODUIT_DELETE ')")
Listing 5.11: Nouvelle annotation @PreAuthorize
Cette approche assure une distinction nette entre les rôles et les permissions métier,
améliore la maintenabilité et la scalabilité du système, tout en intégrant correcte-
ment la hiérarchie propre aux autorisations métier.
• Solution mise en place coté Frontend Pour garantir une parfaite cohérence
avec l’architecture backend, où les permissions sont nettement séparées des rôles,
le frontend a été modifié via des ajustements automatiquement produits et inté-
grés par notre blueprint JHipster, afin d’assurer cette séparation entre autorités et
permissions.
66
15 . stream ()
16 .map( GrantedAuthority :: getAuthority ).map( authority -> {
17 Authority auth = new Authority ();
18 auth. setName ( authority );
19 return auth;
20 })
21 . collect ( Collectors . toSet ())
22 );
23 user = syncUserWithIdP ( attributes , user);
24 Set <String > authorityNames = authToken . getAuthorities (). stream ()
25 .map( GrantedAuthority :: getAuthority )
26 . collect ( Collectors . toSet ());
27 Set <Authority > authorities = authorityRepository
28 . findAllById ( authorityNames )
29 . stream ()
30 . collect ( Collectors . toSet ());
31 user. setAuthorities ( authorities );
32 Set <Permission > permissions =
permissionRepository . findByAuthoritiesNameIn ( authorityNames );
33 Set <String > permissionNames = permissions . stream ()
34 .map( Permission :: getName )
35 . collect ( Collectors . toSet ());
36 AdminUserDTO userDTO = new AdminUserDTO (user);
37 userDTO . setPermissions ( permissionNames );
38 return userDTO ;
39 }
Listing 5.12: Exemple Méthode getUserFromAuthentication aprés séparaion
des permissios et authorités
67
– Génération d’une directive Directive Angular Pour permettre l’affichage
ou le masquage dynamique des éléments d’interface en fonction des permis-
sions, le blueprint crée une directive Angular personnalisée nommée jhiHasA-
nyPermission. Cette directive facilite la gestion des contrôles d’affichage liés
aux permissions, en proposant une syntaxe claire et intuitive dans les tem-
plates HTML. Elle s’appuie exclusivement sur les permissions, sans considérer
directement les rôles, afin d’assurer un contrôle d’accès précis et conforme à
la logique métier. Ainsi, plutôt que d’utiliser la directive jhiHasAnyAuthori-
ty, on utilise jhiHasAnyPermission, qui est spécialement conçue pour gérer et
contrôler les permissions.
5.4 Conclusion
Ce chapitre a permis de mettre en lumière les configurations automatisées par le blue-
print au niveau du frontend, en révélant les limites des approches standards de JHipster
concernant l’intégration dynamique des rôles et permissions dans l’interface utilisateur.
Nous avons détaillé les fichiers Angular générés ou modifiés automatiquement, ainsi que
la logique conditionnelle introduite pour adapter l’affichage en fonction des droits des
utilisateurs. Enfin, ce chapitre a souligné les actions de maintenance automatisées visant
à améliorer la gestion de la confidentialité et à optimiser les performances globales des
applications générées.
68
Chapitre 6
Introduction
L’objectif principal de ce projet était de renforcer la gestion des rôles et des permissions
dans une application générée JHipster quelque soit son architecture, tout en assurant une
personnalisation fine de l’interface utilisateur selon les droits attribués à chaque profil.
Le blueprint développé permet d’automatiser l’intégration de ces règles de sécurité dans
l’ensemble du système, Aussi bien côté backend que côté frontend. Ce chapitre met en
lumière les résultats pratiques obtenus suite à la mise en œuvre du blueprint. Il permettra
de mettre en évidence les effets fonctionnels observés, notamment :
69
Les interfaces illustrées dans les sections suivantes proviennent directement de ces deux
projets de test. Elles permettent de démontrer de manière concrète l’efficacité du blueprint
dans des contextes applicatifs réalistes.
• Les boutons d’action tels que ”Créer”, ”Modifier” ou ”Supprimer” sont affichés pour
tous les utilisateurs.
• Aucun mécanisme conditionnel n’est mis en place pour restreindre l’affichage des
composants selon les rôles ou permissions.
Exemple visuel
• Utilisateur Simple
Interface affichée (6.1) pour un utilisateur simple disposant du rôle ROLE-USER.
On observe que toutes les actions, y compris celles normalement réservées aux ad-
ministrateurs, sont visibles et accessibles.
70
Fig. 6.2 : Interface vue par les administrateurs
• Les utilisateurs ayant ROLE-USER peuvent accéder à toutes les entités et effectuer
des opérations sans restriction apparente.
• Utilisateur Simple : Interface affichée fig (6.3) pour un utilisateur simple (ROLE-
USER), présentant toutes les fonctionnalités disponibles sans aucune restriction.
71
Fig. 6.4 : Interface administrateur
72
• Interface utilisateur 6.6 est générée pour ce même utilisateur, affichant uniquement
les actions autorisées, conformément aux permissions et à leur hiérarchie.
• L’image 6.7 illustre le cas d’un utilisateur qui tente d’accéder directement, via l’URL,
à une interface pour laquelle il ne dispose d’aucune permission. Grâce au système
de sécurité mis en place par le blueprint, l’accès est immédiatement bloqué, et un
message d’erreur ou un redirectionnement est déclenché.
73
(via l’URL par exemple), l’accès est automatiquement bloqué si la permission
requise n’est pas présente. Ce filtrage est assuré côté frontend (via les guards)
et renforcé côté backend (via les annotations de sécurité @PreAuthorize).
74
Fig. 6.10 : Accès bloqué à une route sécurisé dans une application monolithique
– Cas du microservice
∗ Interface [Link] : Cette interface est générée dyna-
miquement par le blueprint pour chaque microservice. Elle permet de gé-
rer les rôles internes au microservice et elle est accessible depuis le bouton
”Mettre à jour” du gateway (cf. Fig. 6.12).
75
Fig. 6.13 : Interface de gestion des rôles pour les microservice
Conclusion
L’intégration du blueprint développé a permis de transformer en profondeur la gestion
des rôles et des permissions dans les applications JHipster, qu’elles soient en architecture
microservices ou monolithique. Grâce à une interface utilisateur désormais conditionnée
par des permissions explicites et hiérarchisées, chaque utilisateur bénéficie d’une expé-
rience adaptée à ses droits, garantissant à la fois la confidentialité et la clarté. Le système
mis en place empêche efficacement les accès non autorisés, même en cas de tentative
directe via l’URL, tout en assurant un rendu graphique cohérent et ergonomique. Ce tra-
vail illustre ainsi l’impact concret d’une gestion centralisée et granulaire des droits sur la
robustesse et la personnalisation des applications web générées avec JHipster.
76
Conclusion
Ce projet de fin d’études s’est articulé autour d’une problématique actuelle et stra-
tégique : automatiser la gestion fine des accès dans les applications JHipster, tout en
garantissant un haut niveau de sécurité et une adaptabilité aux architectures modernes.
Face aux limites du mécanisme RBAC standard de JHipster — souvent rigide, peu granu-
laire et difficilement extensible — la conception d’une solution personnalisée, centralisée
et hiérarchisée s’est imposée comme une nécessité.
L’objectif métier principal consistait à doter Lear Corporation d’un blueprint modu-
laire, réutilisable et automatisé, capable de générer dès la création d’un projet JHipster
une couche de sécurité complète et cohérente. L’enjeu était double : réduire significati-
vement les tâches de configuration manuelle et renforcer la cohérence, la traçabilité et
la conformité des accès, dans des environnements aussi bien monolithiques que microser-
vices, avec une intégration fluide de Keycloak et OAuth2.
Au-delà des réalisations techniques, ce projet m’a offert une expérience concrète et
professionnalisante. Il m’a permis de consolider mes compétences en sécurité des systèmes
d’information, en architecture logicielle, et en automatisation des processus de développe-
ment, tout en développant une approche rigoureuse, structurée et orientée vers les enjeux
métier.
En contribuant à un projet à fort impact pour l’entreprise, j’ai pu poser les bases solides
de ma future carrière dans le domaine des systèmes d’information et de la transformation
digitale, avec la satisfaction d’avoir conçu une solution à la fois technique, pragmatique
et durable.
77
Perspectives et travaux futurs
78
Bibliographie
[1] Reference for Business. Lear Corporation History. Consulté en avril 2025. 2023.
url : https : / / www . referenceforbusiness . com / history / Ja - Lo / Lear -
[Link].
[2] Lear Corporation. Advanced Seating Innovation - INTU. Consulté en avril 2025.
2023. url : [Link]
innovation/intu.
[3] Lear Corporation. E-Systems Technology. Consulté en avril 2025. 2023. url :
[Link]
[4] Lear Corporation. Official Website. Consulté en avril 2025. 2023. url : https:
//[Link]/.
[5] Charika. Lear Corporation Engineering Morocco - Fiche signalétique. Consulté en
avril 2025. 2023. url : [Link]
engineering-morocco-793976.
[6] Okta. Contrôle d’accès basé sur les rôles (RBAC) vs. contrôle d’accès basé sur les
attributs (ABAC). Consulté en avril 2025. 2023. url : [Link]
fr/identity-101/role-based-access-control-vs-attribute-based-access-
control/.
[7] OneLogin. RBAC vs ABAC : Quelle est la différence ? Consulté en avril 2025.
2023. url : [Link]
[8] LinkedIn. Avantages et inconvénients de RBAC vs ABAC. Consulté en avril 2025.
2023. url : https : / / fr . linkedin . com / advice / 1 / what - pros - cons - role -
based-access-control-rbac-versus?lang=fr.
[9] Logto. Comprendre RBAC et ABAC. Consulté en avril 2025. 2023. url : https:
//[Link]/fr/rbac-and-abac.
[10] Kiteworks. Contrôle d’accès basé sur les attributs (ABAC). Consulté en avril
2025. 2023. url : https : / / www . kiteworks . com / fr / glossaire / controle -
access-base-attributs/.
[11] Ping Identity. Méthodes d’autorisation : ABAC, RBAC, PBAC, ReBAC. Consulté
en avril 2025. 2023. url : https : / / www . pingidentity . com / fr / resources /
identity-fundamentals/authorization/[Link].
[12] Frontegg. RBAC vs ABAC vs PBAC : Quelle est la meilleure approche ? Consulté
en avril 2025. 2023. url : [Link]
pbac.
79
[13] Styra. Qu’est-ce que RBAC, ABAC et PBAC ? Consulté en avril 2025. 2023. url :
[Link]
[14] JHipster Team. JHipster Documentation – Blueprints. Consulté en mai 2025. 2024.
url : [Link]
[15] JHipster Team. Why use a blueprint – JHipster Documentation. Consulté en mai
2025. 2024. url : [Link]
#why-use-a-blueprint.
[16] JHipster Team. Liste des blueprints dans l’écosystème JHipster. Consulté en mai
2025. 2024. url : https : / / github . com / jhipster / generator - jhipster #
blueprints.
[17] JHipster Team. Blueprint generator phases – JHipster Documentation. Consulté
en mai 2025. 2024. url : [Link]
blueprint/#blueprint-generator-phases.
80