Sécuriser les microservices avec Spring Security : implémentation de JWT
PHPz
Libérer: 2024-08-24 06:42:38
original
301 Les gens l'ont consulté
JETON WEB JSON (JWT)
JWT (JSON Web Token) est une méthode permettant de transmettre en toute sécurité des informations entre deux parties (comme un client et un serveur) en tant qu'objet JSON. Il est conçu pour être compact et sécurisé pour les URL, ce qui facilite sa transmission dans les URL et les en-têtes.
En-tête
Charge utile
Signature
En-tête L'en-tête se compose généralement de deux parties : le type de jeton (JWT) et l'algorithme de signature utilisé, tel que HMAC SHA256 ou RSA.
{ "alg": "HS256", "typ": "JWT" }
Charge utile C'est là que les données réelles sont stockées. Il peut inclure des informations telles que l'ID utilisateur, les rôles, l'heure d'expiration et d'autres réclamations (données sur l'utilisateur ou la session).
Signature Garantit l’intégrité du jeton. Il s’agit d’une fonction de sécurité qui garantit que le jeton n’a pas été modifié. Il est créé en combinant l’en-tête et la charge utile codés avec une clé secrète à l’aide de l’algorithme spécifié. La signature aide le serveur à vérifier que le jeton est légitime et n'a pas été falsifié.
Les avantages de JWT
Pas besoin d'envoyer des informations d'identification à plusieurs reprises :Avec JWT, vous n'avez pas besoin d'envoyer votre nom d'utilisateur et votre mot de passe à chaque demande. Au lieu de cela, vous vous connectez une fois et le serveur vous donne un jeton. Vous envoyez ensuite ce jeton à chaque demande pour prouver votre identité, rendant le processus plus sécurisé et efficace.
Expiration intégrée :Chaque JWT est livré avec un délai d'expiration, ce qui signifie qu'il n'est valable que pour une période spécifique. Cela réduit le risque d’utilisation abusive à long terme si un jeton est intercepté d’une manière ou d’une autre. Après son expiration, l'utilisateur doit se reconnecter pour obtenir un nouveau jeton, ajoutant ainsi une couche de sécurité supplémentaire.
JWT avec Spring Boot gère en toute sécurité l'authentification des utilisateurs en émettant des jetons après la connexion. Ces jetons sont envoyés à chaque demande, garantissant une communication sécurisée et sans état sans envoyer d'informations d'identification à plusieurs reprises.
Communication sans étatsignifie que le serveur ne se souvient pas des demandes passées. Chaque requête contient tout ce dont vous avez besoin (comme un JWT), de sorte que le serveur ne stocke pas les informations de session.
La mise en œuvre de JWT dans une application Java Spring Boot implique plusieurs étapes. Voici un aperçu simplifié pour vous aider à démarrer :
1. Ajouter des dépendances
Incluez les dépendances nécessaires dans votre fichier pom.xml
Toutes les dépendances dont nous avons besoin pour créer l'application spring-boot avec JWT
4.0.0org.springframework.bootspring-boot-starter-parent3.3.3com.tier3Hubuser-auth-service0.0.1-SNAPSHOTuser-auth-serviceThe user-auth-service is a microservice responsible for handling user authentication and authorization within a distributed system. It is designed to manage user login, registration, and secure access to various services using robust security practices. This service implements authentication mechanisms like JSON Web Tokens (JWT) and integrates with OAuth 2.0 for third-party authentication. Built with Spring Boot, it ensures scalability, reliability, and easy integration with other microservices in the system.21org.springframework.bootspring-boot-starter-actuatororg.springframework.bootspring-boot-starter-data-jpaorg.springframework.bootspring-boot-starter-securityorg.springframework.bootspring-boot-starter-webio.jsonwebtokenjjwt-api0.12.5io.jsonwebtokenjjwt-impl0.12.5runtimeio.jsonwebtokenjjwt-jackson0.12.5runtimecom.mysqlmysql-connector-jruntimeorg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.springframework.securityspring-security-testtestorg.springframework.bootspring-boot-starter-validationorg.springdocspringdoc-openapi-starter-webmvc-ui2.5.0org.modelmappermodelmapper3.1.1org.springframework.bootspring-boot-maven-pluginorg.projectlomboklombok
Copier après la connexion
nous utilisons différents types de dépendances comme
Spring Boot Starter Actuator : 3.3.3 - Ajoute des fonctionnalités prêtes pour la production telles que la surveillance et les contrôles de santé.
Spring Boot Starter Data JPA : 3.3.3 - Simplifie les interactions de base de données avec le support JPA.
Spring Boot Starter Security : 3.3.3 - Fournit des fonctionnalités de sécurité telles que l'authentification et l'autorisation.
Spring Boot Starter Web : 3.3.3 - Prend en charge la création d'applications Web, y compris les services RESTful.
API JJWT : 0.12.5 - Gère la création et l'analyse JWT pour une gestion sécurisée des jetons.
JJWT Impl : 0.12.5 - Implémente les fonctionnalités de base de JWT.
JJWT Jackson : 0.12.5 - Permet l'analyse JWT JSON à l'aide de Jackson.
MySQL Connector : Runtime - Connecte votre application à une base de données MySQL.
Lombok : Non spécifié - Réduit le code passe-partout avec des annotations.
Spring Boot Starter Test : 3.3.3 - Fournit une prise en charge des tests pour les applications Spring Boot.
Spring Security Test : 3.3.3 - Aide à tester les configurations de sécurité.
Spring Boot Starter Validation : 3.3.3 - Ajoute la prise en charge de la validation pour les objets de requête et de réponse.
SpringDoc OpenAPI Starter WebMVC UI : 2.5.0 - Intègre l'interface utilisateur Swagger pour la documentation de l'API.
ModelMapper : 3.1.1 - Simplifie le mappage d'objets entre différentes couches.
*2. Structure du projet *
3. Ajoutez la configuration dans le fichier application.properties
package com.tier3Hub.user_auth_service.dto; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor @Data public class RegisterDTO { @NotBlank(message = "Username is required") @Size(min = 3, max = 20, message = "Username must be between 3 and 20 characters") private String username; @NotBlank(message = "Password is required") @Size(min = 8, message = "Password must be at least 8 characters") private String password; @NotBlank(message = "Email is required") @Email(message = "Email should be valid") private String email; }
*7. pour envoyer une réponse personnalisée depuis l'API, nous utilisons ResponseHandler.java *
package com.tier3Hub.user_auth_service.utils; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import java.util.HashMap; import java.util.Map; public class ResponseHandler { public static ResponseEntity
Copier après la connexion
8. for storing some constants we create the class inside the utils package that is ApplicationConstants.java
package com.tier3Hub.user_auth_service.utils; public class AppConstants { public static final String[] PUBLIC_URLS = { "/v3/api-docs/**", "/swagger-ui/**", "/api/auth/register/**", "/api/auth/login/**","/api/auth/registerAdmin/**" }; }
Copier après la connexion
9. for converting the object one to another we use the dependency that is model mapper for configuration that we create the class inside the config package that is ApplicationConfigs.java
package com.tier3Hub.user_auth_service.config; import org.modelmapper.ModelMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ApplicationConfigs { @Bean public ModelMapper modelMapper() { return new ModelMapper(); } }
Copier après la connexion
** This is the basic setup that we do for every spring-boot application we create now securing the rest endpoint with JWT we started. **
now inside the security package we create the class called JWTFilter.java
The JWTFilter is a custom Spring Security filter that intercepts HTTP requests to validate JWTs. It checks for the "Authorization" header, extracts the token, and retrieves the username. If the token is valid, it creates an authentication token with user details and sets it in the security context, allowing the application to recognize the authenticated user for further processing.
The JWTUtil class manages JWT operations, including extracting usernames and expiration dates from tokens. It generates new tokens using a secret key and validates existing tokens by checking their expiration. The class uses HMAC for signing and includes methods to parse claims and determine if tokens are expired, ensuring secure authentication and authorization in the application.
*configure the Spring security and add some modifictaion we create the class SecurityConfig.java *
The SecurityConfig class sets up security for the application using Spring Security. It defines access rules, allowing public endpoints while restricting others based on user roles. The class incorporates a JWT filter to validate tokens and uses BCrypt for password encoding. It also configures an authentication manager with a custom user details service for secure user authentication.
The securityFilterChain method configures access rules for different API endpoints in the Spring application. It permits public URLs and applies role-based access control for user and admin roles. Role-based authentication restricts resource access based on user roles (e.g., USER, ADMIN). In Spring Boot, you define roles and configure security settings in the SecurityConfig class to specify access permissions. During user registration, assign roles, and use annotations like @PreAuthorize to enforce role checks in controllers. This approach enhances security, allows easy permission management, and simplifies user access rights as the application scales. Implementing role-based auth provides flexibility and maintainability for your user management system. CSRF protection is disabled, and a custom JWT filter is added to authenticate requests based on JSON Web Tokens, ensuring secure and controlled access to resources.
configureGlobal method handle configures global authentication settings in a Spring application. It uses a custom user details service for loading user data and a BCrypt password encoder for secure password hashing. Additionally, it provides an AuthenticationManager bean for handling authentication processes, ensuring a secure and efficient user authentication system that leverages strong password management practices.
This login method in the AuthController handles user login requests. It takes a LoginDTO containing the username and password, validates them, and attempts authentication using the AuthenticationManager. Upon successful authentication, it retrieves user details and generates a JWT token using the JWTUtil class. The token is then included in a LoginResponse object and returned with a success message. If authentication fails, it catches the exception and returns a "Incorrect username or password" response with a 400 status code.
generateToken(String username):This method creates an empty claims map and calls the createToken method with the username as the subject. It serves as the entry point for token generation.
c*reateToken(Map claims, String subject):* This method builds the JWT using the Jwts.builder(). It sets the claims, subject, and token metadata, such as issue date and expiration time (set to 5 minutes). The token is then signed with a secret key and compacted into a string format for transmission.
Testing
now we run the application
and hit the URL here our application is runing on 8000 port
http://localhost:8000/swagger-ui/index.html
L'utilisation de Swagger dans votre projet améliore la documentation et les tests de l'API. Il fournit une interface conviviale permettant aux développeurs d'explorer vos API, de comprendre les structures de requête/réponse et de tester les points de terminaison directement à partir de la documentation. En intégrant Swagger, vous activez la génération automatique de documents API basés sur vos annotations de code, ce qui facilite la collaboration efficace des développeurs front-end et back-end.
nous enregistrons d'abord l'utilisateur
nous obtenons la réponse comme celle-ci
après cela, nous connectons l'utilisateur
nous obtenons la réponse comme celle-ci
Conclusion
Le projet implémente l'authentification basée sur les rôles à l'aide de JWT (JSON Web Tokens) dans une application Spring Boot. Il dispose d'un mécanisme d'authentification sécurisé grâce auquel les utilisateurs peuvent s'inscrire et se connecter, recevant un JWT qui accorde l'accès en fonction des rôles qui leur sont attribués (comme USER ou ADMIN). La classe SecurityConfig configure les autorisations d'accès, garantissant que les points de terminaison publics sont accessibles à tous tout en limitant les opérations sensibles aux utilisateurs autorisés uniquement. La classe JWTUtil gère la création, la validation et l'extraction des jetons. Dans l'ensemble, cette configuration améliore la sécurité, permettant un contrôle d'accès transparent et robuste dans l'ensemble de l'application.
Le projet utilise un cadre de sécurité complet qui exploite Spring Security pour l'authentification et l'autorisation des utilisateurs. L'AuthController facilite l'enregistrement et la connexion des utilisateurs, générant un JWT en cas d'authentification réussie. L'application utilise un JWTFilter pour intercepter les demandes et valider les jetons, garantissant ainsi que seuls les utilisateurs authentifiés peuvent accéder aux ressources protégées. En intégrant un contrôle d'accès basé sur les rôles, le projet fournit un système de gestion des utilisateurs flexible et sécurisé. Cette conception améliore non seulement la sécurité, mais améliore également l'expérience utilisateur en minimisant le besoin de connexions répétées. Dans l’ensemble, il constitue une base solide pour la création de microservices évolutifs et sécurisés.
Vous pouvez explorer le code source complet du service d'authentification utilisateur sur mon référentiel GitHub. Ce projet présente diverses fonctionnalités telles que l'enregistrement des utilisateurs, la connexion et l'accès sécurisé à l'aide de JWT pour l'authentification. N'hésitez pas à le consulter, à contribuer ou à l'utiliser comme référence pour vos propres projets !
Pour ceux qui souhaitent approfondir leurs connaissances sur les jetons Web JSON (JWT), je recommande de visiter jwt.io. Cette ressource fournit des informations complètes sur JWT, notamment son fonctionnement, sa structure et des exemples pratiques. Il s'agit d'un excellent point de départ pour comprendre l'authentification et l'autorisation basées sur des jetons, essentielles aux applications Web modernes. Que vous soyez débutant ou que vous cherchiez à rafraîchir vos connaissances, jwt.io offre des informations précieuses sur la gestion sécurisée des sessions utilisateur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn