Spring security
Introduction
De manière générale, votre application Spring est composée de plusieurs modules qui fonctionnent indépendamment les uns des autres.
-
Spring Security fait partie de ces modules. Les modules Spring ressemblent à des conteneurs fermés, permettant à d’autres modules Spring de fonctionner ensemble, sans aucun conflit.
-
L’ajout de Spring Security, vise comme premier objectif de protéger les requêtes HTTP traitées sur votre application.
-
Chaque fois qu’un utilisateur clique sur un bouton ou qu’une information est transférée d’un tiers vers l’autre d’une application web, une requête HTTP est envoyée. Elle doit être sécurisée.
-
Ces requêtes HTTP adressées à votre application web traversent différents niveaux de protection après l’installation de Spring Security :
-
Un pare-feu HTTP.
-
Un proxy.
-
Des filtres.
-
Le pare-feu
Le pare-feu HTTP se trouve en première ligne de toute infrastructure.
C’est le dispositif qui filtre le flux de communication, en étant très sélectif sur les informations qui pénètrent dans l’application.
C’est un système permettant de filtrer les paquets de données échangés entre un réseau externe et l’application web. il s’agit ainsi d’une passerelle filtrante comportant au minimum les interfaces réseau suivante :
-
Une interface pour le réseau à protéger réseau interne de l’application
-
Une interface pour le réseau externe.
Le proxy
En deuxième lieu se trouve le proxy. Une autorité extérieure qui gère les accès à une source protégée : votre application web.
Un pare-feu contient généralement un ensemble de règles prédéfinies permettant de :
-
D’autoriser la connexion (allow);
-
De bloquer la connexion (deny);
-
De rejeter la demande de connexion sans avertir l’émetteur (drop).
Le filtrage applicatif permet de filtrer les communications application par application. Le filtrage applicatif opère donc au niveau 7 (couche application) du modèle OSI, contrairement au filtrage de paquets simple (niveau 4).
Le filtrage applicatif suppose donc une connaissance des protocoles utilisés par chaque application.
Les filtres
Les filtres s’assurent que toutes les requêtes HTTP à destination de l’application web sont sécurisées.
Chaque filtre (rule) fournit une configuration de sécurité que vous pouvez intégrer à votre application web.
Cette collection de filtres servlet implantés est appelée chaîne de filtres de Spring Security.
Liaison Proxy - Filter
Grâce à la classe DelegatingFilterProxy (qui implémente le patron de conception proxy) la chaîne de filtres de Spring Security est intégré à votre application. Les filtres de sécurité sont ensuite ajoutés pour créer un moteur de sécurité pour l’application. Selon le niveau de complexité désiré par le développeur, les filtres peuvent fournir des configurations de sécurité simples ou avancées contre les attaques. De plus, le framework Spring permet de personnaliser la configuration des servlets nécessaires à l’application web.
Pour un filtre permettant de sécuriser vos informations de connexion, la requête depuis le front-end et passe le premier pare-feu, DelegatingFilterProxy s’occupe de classer le trafic HTTP, et de l’envoyer vers les filtres de la chaîne de Spring Security prenant en charge les informations de connexion.
Même si aucun filtre n’a été programmé, votre application disposera quand-même de fonctionnalités autoconfigurées et performantes de Spring Security, simplement grâce à l’ajout de ce dernier ! |
Authentification et autorisation
-
Pour une connexion à un espace personnel sur le site de votre banque, l’application web doit vous authentifier, vérifie l’identité de l’utilisateur et accorde les autorisations appropriées.
-
L’authentification et l’autorisation constituent le cœur de Spring Security.
-
En sécurité, nous parlons de contrôle d’accès. Il s’agit de contrôler l’accès à une application web nécessitant un mécanisme de connexion.
Le contrôle d’accès se compose de deux étapes. Vous avez deviné ?
On utilisera Spring Security pour gérer le contrôle d’accès : Authentification + Autorisation |
Focus sur l’authentification
Il faut distinguer 3 scénarios d’authentification :
-
Les données des utilisateurs (identifiant + mot de passe) sont stockés dans une base de données à laquelle le développeur a accès : c’est le cas le plus courant, et celui qui sera détaillé ici.
-
L’application n’a pas directement accès à ces informations et doit passer par exemple par un service REST tiers pour l’authentification.
-
L’authentification est effectuée via OAuth2 (cas d’un “login with Google” par exemple).
La classe HttpSecurity
Pour exploiter les ressources de Spring boot, on sollicite la classe HttpSecurity pour appliquer la chaîne de filtres de sécurité aux requêtes HTTP.
Par défaut, un objet HttpSecurity assure les tâches suivantes :
-
Nécessite que l’accès à l’application se fait via une authentification
-
Les utilisateurs se connectent grâce à un formulaire de login
-
Les utilisateurs se fait en utilisant une authentification HTTP basique
-
L’utilisateur lance une requête HTTP /private pour laquelle il n’est pas autorisée
-
Spring Security par le biais de FilterSpringInterceptor indique que l’accès est refusé
-
Puisque l’utilisateur n’est pas authentifié, ExceptionTranslationFilter redirige vers la page login (Redirection effectuée)
-
Le navigateur appelle la page de login
-
Le contrôleur doit retourner la page de login
Dès l’injection de Spring Security, un niveau de sécurité minimum est mis en place exigeant une authentification avant d’accéder à l’application. Ce niveau permet de générer un mot de passe par défaut et une configuration initiale : |
login : user mot de passe :
Exemples d’applications des autorisations
Ces Beans sont à insérer dans le fichier de configuration spring security, créé de façon manuelle :
"InMemory" Authentification
Dans cet exemple, la configuration exige que l’utilisateur doit s’authentifier et doit avoir le rôle ROLE_USER.
Elle définit une authentification de type "InMermoryAuthentication" pour un utilisateur ayant comme login : "user" et comme mot de passe "password".
Personnalisation de la chaine de connexion
Pour personnaliser cet identifiant et le mot de mot passe, on utilisera le fichier resources : application.properties, en paramétrant les valeurs suivantes :
spring.security.user.name=professeur spring.security.user.password=azert123 spring.autoconfigure.exclude=disable
Cette solution reste basique, si on veut créer plusieurs utilisateurs avec des droits différents. La solution à mettre place consiste à créer une classe : Configuration de la sécurité de l’application.
Pour cela on crée :
Un package config Une classe nommée : SecuConfiguration