Comment SpringBoot utilise OAuth2 pour l'authentification et l'autorisation
OAuth2 est un cadre d'autorisation qui peut être utilisé pour sécuriser l'accès aux ressources utilisateur par des applications tierces. Dans SpringBoot, nous pouvons utiliser Spring Security et Spring OAuth2 pour implémenter les fonctions d'authentification et d'autorisation OAuth2. Cet article explique comment utiliser OAuth2 pour l'authentification et l'autorisation dans SpringBoot.
Concepts de base d'OAuth2
Avant de commencer à présenter comment utiliser OAuth2 pour l'authentification et l'autorisation, comprenons les concepts de base d'OAuth2.
Client
Les clients sont des applications qui nécessitent un accès aux ressources utilisateur, telles que les sites Web, les applications mobiles, etc.
Propriétaire de la ressource
Un propriétaire de ressource est un utilisateur qui possède la ressource d'un utilisateur.
Serveur d'autorisation
Le serveur d'autorisation fait référence au serveur utilisé pour gérer l'autorisation des utilisateurs, qui est chargé de vérifier l'identité des clients et de fournir des jetons d'accès aux clients.
Serveur de ressources
Un serveur de ressources fait référence à un serveur qui stocke les ressources utilisateur et est responsable de la validation des jetons d'accès et de la fourniture des ressources utilisateur aux clients.
Jeton d'accès
Un jeton d'accès est un jeton qu'un client utilise pour accéder aux ressources utilisateur, émis par un serveur d'autorisation.
Actualiser le jeton
Les jetons d'actualisation sont utilisés pour renouveler les jetons d'accès afin que les clients puissent continuer à accéder aux ressources utilisateur.
Portée de l'autorisation (Périmètre)
L'étendue de l'autorisation fait référence aux autorisations que le client demande pour accéder aux ressources de l'utilisateur.
Spring Security et Spring OAuth2
Spring Security est un framework de sécurité basé sur Spring qui fournit des fonctions d'authentification et d'autorisation. Spring OAuth2 est la fonction d'authentification et d'autorisation d'OAuth2 implémentée sur la base de Spring Security.
Spring OAuth2 fournit les composants de base suivants :
- Serveur d'autorisation : Un serveur utilisé pour gérer l'autorisation des utilisateurs.
- Serveur de ressources : Un serveur qui stocke les ressources utilisateur.
- Client : une application qui doit accéder aux ressources de l'utilisateur.
- Jeton d'accès : un jeton utilisé pour accéder aux ressources de l'utilisateur.
Utilisez OAuth2 dans SpringBoot pour l'authentification et l'autorisation
Dans SpringBoot, nous pouvons utiliser Spring Security et Spring OAuth2 pour implémenter les fonctions d'authentification et d'autorisation OAuth2. Ci-dessous, nous utiliserons un exemple simple pour présenter comment utiliser OAuth2 pour l'authentification et l'autorisation dans SpringBoot.
ajouter des dépendances
Tout d'abord, ajoutez les dépendances suivantes pom.xml
au fichier :
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Spring Security OAuth2 -->
<dependency>
<groupId>org.springframework.security.oauth</groupId>
<artifactId>spring-security-oauth2</artifactId>
<version>2.3.7.RELEASE</version>
</dependency>
</dependencies>
Configurer Spring Security¶
Dans SpringBoot, nous pouvons utiliser Java Config pour configurer Spring Security. Ajoutez la configuration suivante au SecurityConfig.java
fichier :
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(passwordEncoder);
return authenticationProvider;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/oauth/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().permitAll()
.and()
.logout().permitAll()
.and()
.csrf().disable();
// 配置 OAuth2 认证
http.oauth2Login();
}
}
Dans le code ci-dessus, nous en configurons d'abord un DaoAuthenticationProvider
pour obtenir les informations utilisateur de la base de données et nous authentifier. Enregistrez- vous configure(AuthenticationManagerBuilder auth)
ensuite dans la méthode. Ensuite, l'autorisation de la requête est configurée dans la méthode , la requête autorisée ne nécessite pas d'authentification et le reste des requêtes doit être authentifié. Enfin, nous utilisons la méthode pour activer la fonctionnalité de connexion OAuth2.authenticationProvider()
AuthenticationManagerBuilder
configure(HttpSecurity http)
/oauth/**
http.oauth2Login()
Configurer OAuth2
Pour configurer OAuth2 dans SpringBoot, vous devez ajouter la configuration suivante au application.yml
fichier :
spring:
security:
oauth2:
client:
registration:
custom-client:
client-id: client-id
client-secret: client-secret
authorization-grant-type: authorization_code
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
scope:
- read
- write
client-name: Custom Client
provider:
custom-provider:
authorization-uri: https://custom-provider.com/oauth/authorize
token-uri: https://custom-provider.com/oauth/token
user-info-uri: https://custom-provider.com/userinfo
user-name-attribute: sub
Dans la configuration ci-dessus, nous avons configuré un client OAuth2 custom-client
nommé , y compris client-id
, client-secret
, authorization-grant-type
, redirect-uri
, scope
et client-name
d'autres informations. Dans le même temps , nous avons également configuré un fournisseur de services OAuth2 custom-provider
nommé , comprenant authorization-uri
, , et d'autres informations.token-uri
user-info-uri
user-name-attribute
créer un contrôleur
Enfin, nous devons créer un contrôleur pour gérer les demandes liées à l'authentification et à l'autorisation OAuth2. Ajoutez le code suivant au OAuth2Controller.java
fichier :
@RestController
@RequestMapping("/oauth")
public class OAuth2Controller {
@GetMapping("/callback")
public String callback() {
return "callback";
}
@GetMapping("/user")
public Principal user(Principal principal) {
return principal;
}
}
Dans le code ci-dessus, nous avons créé deux méthodes, callback()
la méthode est utilisée pour traiter la demande de rappel d'OAuth2, et user()
la méthode est utilisée pour obtenir les informations de l'utilisateur actuellement connecté.
Tester l'authentification et l'autorisation OAuth2
Maintenant, nous avons terminé la configuration de l'authentification et de l'autorisation en utilisant OAuth2 dans SpringBoot. Ensuite, nous pouvons utiliser des outils tels que Postman ou un navigateur pour tester les fonctions d'authentification et d'autorisation d'OAuth2.
Tout d'abord, nous devons utiliser pour https://custom-provider.com/oauth/authorize
accéder à la page d'autorisation OAuth2, entrer le nom d'utilisateur et le mot de passe, et effectuer l'opération d'autorisation. Nous serons alors redirigés vers redirect-uri
l'adresse indiquée , par exemple http://localhost:8080/login/oauth2/code/custom-client
.
Après avoir obtenu le code d'autorisation, nous pouvons utiliser la commande suivante pour obtenir le jeton d'accès :
curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code&code=授权码&redirect_uri=http://localhost:8080/login/oauth2/code/custom-client&client_id=client-id&client_secret=client-secret" \
https://custom-provider.com/oauth/token
Après avoir obtenu le jeton d'accès, nous pouvons utiliser la commande suivante pour accéder à la ressource protégée :
curl -H "Authorization: Bearer 访问令牌" \
https://custom-provider.com/userinfo
Si l'accès réussit, des informations sur l'utilisateur actuel seront renvoyées.
Résumer
Dans cet article, nous avons expliqué comment utiliser OAuth2 pour l'authentification et l'autorisation dans SpringBoot. Nous avons d'abord présenté les concepts de base d'OAuth2 et les connaissances pertinentes de Spring Security et Spring OAuth2, puis expliqué en détail comment configurer Spring Security et OAuth2 dans SpringBoot, et comment créer des contrôleurs pour gérer les demandes liées à OAuth2. Grâce à l'explication de cet article, je pense que les lecteurs ont maîtrisé les bases de l'utilisation d'OAuth2 dans SpringBoot pour l'authentification et l'autorisation.