J'ai déjà un serveur d'autorisation OAuth2 en cours d'exécution dans un autre projet. Maintenant, j'aurais besoin de sécuriser plusieurs serveurs de repos simples à démarrage à ressort avec OAuth2. Mais je trouve que la documentation de Spring est vraiment très limitée lorsqu'il s'agit de séparer les serveurs d'autorisation et de ressources.
J'ai également trouvé plusieurs questions où la réponse a été "Eh bien, ils peuvent être des boîtes différentes tant qu'ils partagent la même source de données tokenStore". Cela peut-il vraiment être vrai? Comment cela pourrait-il fonctionner pour les microservices? Il semblerait vraiment étrange que chaque service de repos ait besoin d'implémenter son propre serveur d'autorisation OAuth.
Alors, comment configurer la sécurité Oauth2.0 pour les points de terminaison de repos à démarrage à ressort qui font référence à un serveur d'autorisation Oauth distant (peut-être même pas écrit avec Spring)?
Il y a cette chose appelée RemoteTokenServices qui semble prometteuse mais qui n'est pas vraiment documentée du tout.
Lors de la configuration de votre serveur auh:
Créez un nouveau clientDétails ClientDetailsServiceConfigurer
pour le serveur de ressources. qui sera utilisé pour configurer RemoteTokenService
.
Configurez Spring Security OAuth2 dans votre serveur de ressources:
Créer une classe qui est annoter avec @EnableWebSecurity
, @Configuration
et se prolonge WebSecurityConfigurerAdapter
.
@Configuration
@EnableWebSecurity
protected static class ResourceConfiguration extends WebSecurityConfigurerAdapter {
// methods
}
Créez une méthode avec @Bean annotée qui retournera une instance de TokenService
, qui sera utilisée pour créer AuthenticationManager
.
Dans cette méthode , créer une instance de RemoteTokenService
et ensemble clientId, client_secret, checkTokenEndpointUrl et DefaultAccessTokenConverterWithClientRoles
(cette classe est notre implémentation pour obtenir client_authority lors de l' authentification accessToken dans le serveur OAuth2.)
@Bean
public ResourceServerTokenServices tokenService() {
RemoteTokenServices tokenServices = new RemoteTokenServices();
tokenServices.setClientId("resource_id");
tokenServices.setClientSecret("resource_secret");
tokenServices.setCheckTokenEndpointUrl("http://<server-url>: <port>/oauth/check_token");
return tokenServices;
}
Remplacez la authenticationManagerBean()
méthode et annotez-la avec @Bean
et renvoyez une instance de OAuth2AuthenticationManager
avec TokenService
injected.
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
OAuth2AuthenticationManager authenticationManager = new OAuth2AuthenticationManager();
authenticationManager.setTokenServices(tokenService());
return authenticationManager;
}
Créer une classe annotée avec @EnableResourceServer
, @Configuration
et étendre ResourceServerConfigurerAdapter
.
@Configuration
@EnableResourceServer
protected static class ResourceServerConfig extends ResourceServerConfigurerAdapter {
// Mehotds
}
Remplacer les méthodes Configure forment la super classe pour configurer le serveur de ressources. Configurer différent pour configurer le serveur de ressources.
ResourceServerSecurityConfigurer : pour configurer Resource_id.
HttpSecurity : Cela configurera le filtre de sécurité pour lui indiquer que l'utilisateur requiert une authentification pour les URL protégées (API).
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("resource_id");
}
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.antMatchers("/**").authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
// @formatter:on
}
.antMatcher("/**").authenticated()
cette ligne sécurisera chaque URL d'API de votre serveur de ressources. .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
ne créera pas de session.
PS :: Si quelque chose ne va pas, dites-moi.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots