Dans Spring Cloud OAUTH2 est nécessaire pour implémenter l'authentification et l'autorisation unifiées pour plusieurs microservices. En envoyant un certain type de grant type au OAUTH服务pour l'authentification et l'autorisation centrales, access_token est obtenu. Ce jeton est fiable par d'autres microservices. Nous pouvons utiliser access_token pour l'accès ultérieur, réalisant ainsi l'authentification et l'autorisation unifiées pour les microservices.
Cet exemple fournit quatre parties principales:
discovery-service : module de base pour l'enregistrement des services et la découverteauth-server : Centre de certification et d'autorisation OAuth2order-service : microservice ordinaire, utilisé pour vérifier l'authentification et l'autorisationapi-gateway : Border Gateway (tous les microservices sont derrière)Rôles dans OAuth2:
Resource Server : ressources autorisées à accéderAuthotization Server : Centre d'autorisation de certification OAuth2Resource Owner : utilisateurClient : les clients utilisant des API (comme Android, iOS, les applications Web)Type de subvention:
Authorization Code : utilisé entre les applications du serveurImplicit : utilisé dans les applications mobiles ou les applications Web (ces applications sont sur l'appareil de l'utilisateur, telles que la régulation de WeChat sur le téléphone mobile pour authentifier et autoriser)Resource Owner Password Credentials(password) : l'application est directement fiable (toutes développées par une entreprise, et cet exemple est utiliséClient Credentials : utilisé dans l'accès à l'API de l'application.1. Environnement de base
Utilisez Postgres comme stockage de compte, Redis en tant que stockage Token et démarrez Postgres et Redis sur le serveur à l'aide de docker-compose .
Redis: Image: SameersBn / Redis: Dernières ports: - "6379: 6379" Volumes: - / srv / docker / redis: / var / lib / redis: z redémarrage: AlwaysPostgreSql: Restart: Alway - db_pass = yunfei - db_name = volumes d'ordre: - / srv / docker / postgresql: / var / lib / postgresql: z
2.Auth-Server
2.1 Configuration du service OAuth2
Redis est utilisé pour stocker token . Après le redémarrage du service, il n'est pas nécessaire de recueillir token .
@ Configuration @ perteAuthorizationserverPublic Class AuthorizationsServerConfig étend les autorisations de perconibilitéradapter {@autowired private authenticationManager AuthenticationManager; @Autowired Private RedisConnectionFactory ConnectionFactory; @Bean public Redistokenstore tokenstore () {return new Redistokenstore (ConnectionFactory); } @Override public void configure (AuthorizationserVerendPointSConfigurer Endpoints) lève une exception {endpoint. } @Override public void Configure (AutorizeServerSecurityConfigurer Security) lève une exception {Security .TokenKeyAccess ("permutall ()") .checkTokenAccess ("IsAuthenticated ()"); } @Override public void configure (clientDetailSServiceConfigurer les clients) lève une exception {clients.inMemory () .WithClient ("Android") .Scopes ("xx") // Les lunettes ici sont inutiles, vous pouvez définir .secret ("Android") .AuthorizedGantTypes ("Mot de passe" " .and () .WithClient ("webApp") .Scopes ("xx") .AuthorizedGrantTypes ("Implicit"); }}2.2 Configuration du service de ressources
auth-server fournit des informations utilisateur, donc auth-server est également un Resource Server
@ Configuration @ enableResourceServerPublic Class ResourceServerConfig étend ResourceServerConfigureAdapter {@Override public void configure (httpSecurity http) lève exception {http .csrf (). Disable () .ExceptionHandling (). Response.Senderror (httpServletResponse.sc_unAuthorized)) .And () .AuthorizErequests () .anyRequest (). Authenticated () .and () .httpbasic (); }} @RestControllerPublic class userController {@getMapping ("/ user") public principal utilisateur (utilisateur principal) {return utilisateur; }}2.3 Configuration de sécurité
@ConfigurationPublic Class SecurityConfig étend WebSeCurityConfigurerAdapter {@bean public UserDetailSService UserDetailSService () {return new DomainUserserDeTailSservice (); } @Bean Public PasswordEncoder PasswordEncoder () {return new BCryptPasswordEncoder (); } @Override Protected void configure (AuthenticationManagerBuilder Auth) lève l'exception {Auth .UserDetailSService (UserDetailSService ()) .PasswordEncoder (PasswordEncoder ()); } @Bean Public SecurityEvaluationContexTextension SecurityEvaluationContexTextension () {return new SecurityEvaluationContexTextension (); } // Pas de mot de passe Grant_Type @Override @bean public AuthenticationManager AuthenticationManagerBean () lève une exception {return super.authenticationManagerBean (); }}2.4 Conception de l'autorisation
Le paramètre des autorisations角色(SysRole)用户(SysUser) ) (权限(SysAuthotity) est多对多. Chargez les utilisateurs et les autorisations via DomainUserDetailsService .
2.5 Configuration
Spring: Profiles: Active: $ {spring_profiles_active: Dev} Application: Nom: Auth-Server JPA: Open-in-View: Vraie Database: PostgreSQL Show-SQL: True Hibernate: DDL-AUTO: Update DataSource: Platform: Postgres URL: JDBC: Postgresql: //192.168.1.140: 5432 / AUTERNAME: Mot de passe Wang: Yunfei Driver-Class-Name: org.PostgreSQL.Driver Redis: Host: 192.168.1.140Server: Port: 9999eureka: Client: ServiceUrl: DefaultZone: http: // $ {eureka.host:Localhost}: $ {eureka.port: 8761} /eureka/logging.level.org.springframework.security: Debuglogging.leve.org.springframework: Debug ## est une très importante sécurité: OAUTH2: Resource: Filterwork: 32.6 Données de test
Deux utilisateurs sont initialisés dans data.sql admin -> ROLE_ADMIN -> query_demo , wyf -> ROLE_USER
3.Order-Service
3.1 Configuration du service de ressources
@ Configuration @ enableResourceServerPublic Class ResourceServerConfig étend ResourceServerConfigureAdapter {@Override public void configure (httpSecurity http) lève exception {http .csrf (). Disable () .ExceptionHandling (). Response.Senderror (httpServletResponse.sc_unAuthorized)) .And () .AuthorizErequests () .anyRequest (). Authenticated () .and () .httpbasic (); }}3.2 Configuration des informations utilisateur
order-service est un microservice simple qui utilise auth-server pour l'authentification et l'autorisation. Dans son fichier de configuration, vous pouvez spécifier les informations utilisateur à auth-server :
Sécurité: OAuth2: Ressource: ID: service de service utilisateur-info-uri: http: // localhost: 8080 / uaa / utilisateur préférée-info: false
3.3 Contrôleur de test d'autorisation
L'accès est accessible avec authority sans query-demo , c'est-à-dire l'utilisateur admin
@RestControllerPublic class DemoController {@getMapping ("/ Demo") @preAuthorize ("HasAuthority ('Query-Demo')") public String getDemo () {return "good"; }}4 api-gateway
api-gateway a 2 fonctions dans cet exemple:
implicit4.1 Éteignez CSRF et activez le support client OAuth2
@ Configuration @ activeoAuth2SSOpublic class SecurityConfig étend WebSecurityConfigurerAdapter {@Override Protected void configure (httpSecurity http) lève exception {http.csrf (). Disable (); }}4.2 Configuration
Zuul: Routes: UAA: PATH: / UAA / ** SensitiveHelers: ServiceId: Auth-Server Commande: Path: / Order / ** SensitiveHelers: ServiceId: Order-Service AddProxy-Headers: TruesECurit: OAuth2: Client: Access-Token-Uri: Http: // Localhost: 8080 / UAA / OATUT http: // localhost: 8080 / uaa / oAuth / Authoriser le client-id: webApp Resource: user-ino-uri: http: // localhost: 8080 / uaa / user prefer-token-info: false
5 démo
5.1 appels clients
Utilisez Postman pour envoyer une demande à http://localhost:8080/uaa/oauth/token pour obtenir access_token (pour les utilisateurs d'administration, tels que 7f9b54d4-fd25-4a2c-a848-ddf8f119230b )
utilisateur d'administrateur
Utilisateur WYF
5.2 Appel WebApp dans API-GATEWAY
Aucun test n'est encore terminé, et je les ajouterai la prochaine fois.
6 Adresse du code source
https://github.com/wiselyman/uaa-zuul
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.