In Spring Cloud ist OAUTH2 erforderlich, um eine einheitliche Authentifizierung und Autorisierung für mehrere Microservices zu implementieren. Durch das Senden eines bestimmten Art von grant type an OAUTH服务zur zentralen Authentifizierung und Autorisierung wird access_token erhalten. Dieses Token wird von anderen Microservices vertrauen. Wir können access_token für den anschließenden Zugriff verwenden, wodurch die einheitliche Authentifizierung und Autorisierung für Microservices realisiert wird.
Dieses Beispiel enthält vier Hauptteile:
discovery-service : Basic-Modul für die Registrierung und Entdeckung von Dienstleistungenauth-server : OAuth2-Zertifizierungs- und Autorisierungszentrumorder-service : gewöhnlicher Mikroservice, zur Überprüfung der Authentifizierung und Autorisierungapi-gateway : Grenztateway (alle Microservices stehen dahinter)Rollen in OAuth2:
Resource Server : Ressourcen, die zum Zugriff genommen wurdenAuthotization Server : OAuth2 -ZertifizierungsautorisierungszentrumResource Owner : BenutzerClient : Clients verwenden APIs (wie Android, iOS, Web -Apps)Gewährtyp:
Authorization Code : Verwendet zwischen ServeranwendungenImplicit : Wird in mobilen Apps oder Web -Apps verwendet (diese Apps befinden sich auf dem Gerät des Benutzers, z. B. die Regulierung von WeChat auf dem Mobiltelefon, um sich zu authentifizieren und zu autorisieren)Resource Owner Password Credentials(password) : Die Anwendung wird direkt vertrauen (alle von einem Unternehmen entwickelt, und dieses Beispiel wird verwendetClient Credentials : Verwendet im Anwendungs -API -Zugriff.1. Grundlegende Umgebung
Verwenden Sie Postgres als Kontospeicher, Redis als Token -Speicher und starten Sie Postgres und Redis auf dem Server mithilfe von docker-compose .
Redis: image: sameersbn/redis:latest ports: - "6379:6379" volumes: - /srv/docker/redis:/var/lib/redis:Z restart: alwaysPostgreSQL: restart: always image: sameersbn/postgresql:9.6-2 ports: - "5432:5432" environment: - DEBUG=false - DB_USER=wang - db_pass = yunfei - db_name = order volumes: -/srv/docker/postgresql:/var/lib/postgresql: z
2.Auth-Server
2.1 OAuth2 -Dienstkonfiguration
Redis wird zum Speichern token verwendet. Nach dem Neustart des Dienstes besteht keine Notwendigkeit, token erneut zu treffen.
@Configuration @EnableAuthorizationServerPublic Class AuthorizationServerConfig erweitert die AutorisierungserverConFigurerAdapter {@autowired Private AuthenticationManager AuthenticationManager; @Autowired Private RedisconnectionFactory ConnectoryFactory; @Bean public redistokenStore tokenstore () {return New RedistokenStore (ConnectionFactory); } @Override public void configure (autorisierungserverendpointsconFigurer -Endpunkte) löst Ausnahme aus {Endpoints .AuthenticationManager (AuthenticationManager) .TokenStore (tokenstore ()); } @Override public void configure (autorisierungsversucheConfigurer Security) löst Ausnahme aus {Security .TokenKeyAccess ("GenehmigungsAll ()") .CheckTokenAccess ("isauthenticated ()"); } @Override public void configure (ClientDetailsServiceConfigurer Clients) löst eine Ausnahme aus {Clients.inMemory (). WithClient ("Android"). .and () .withclient ("webapp") .Scopes ("xx") .AuthorizedGrantTypes ("implizit"); }}2.2 Ressourcendienstkonfiguration
auth-server bietet Benutzerinformationen, sodass auth-server auch Resource Server ist
@Configuration@EnableResourceServerpublic class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http .csrf().disable() .exceptionHandling() .authenticationEntryPoint((request, response, authException) -> response.sendError (httpServletResponse.sc_unauthorized)) .and () .AuthorizeRequests () .Anlequest (). authenticated () .and () .htttpbasic (); }} @RestControllerPublic Class UserController {@getMapping ("/user") Public Principal User (Hauptbenutzer) {Rückgabe -Benutzer; }}2.3 Sicherheitskonfiguration
@ConfigurationPublic Class SecurityConfig erweitert WebSecurityConFigurerAdapter {@Bean public userDetailsService userDetailsService () {return New DomainuserDetailsService (); } @Bean public passwordEnCoder passwordEnCoder () {Neue bcryptPasswordEnCoder () zurückgeben; } @Override Protected void configure (AuthenticationManagerBuilder Auth) löst eine Ausnahme aus {Auth .userDetailsService (userDetailsService () .PasswordEnCoder (passwordEncoder ()); } @Bean Public SecurityValuationContextextsion SecurityValuationContexTexTension () {Neue SecurityValuationContextexTension () zurückgeben; } // Kennwort Grant_type @Override @Bean public AuthenticationManager AuthenticationManagerBean () löst Ausnahme aus {return Super.authenticationManagerBean (); }}2.4 Berechtigungsdesign
Die Einstellung用户(SysUser)角色(SysRole) SysROLE)权限(SysAuthotity) ist多对多. Laden Sie Benutzer und Berechtigungen über DomainUserDetailsService .
2.5 Konfiguration
spring: profiles: active: ${SPRING_PROFILES_ACTIVE:dev} application: name: auth-server jpa: open-in-view: true database: POSTGRESQL show-sql: true hibernate: ddl-auto: update datasource: platform: postgres url: jdbc:postgresql://192.168.1.140:5432/auth username: Wang Passwort: Yunfei Fahrerklasse-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.springframework2.6 Testdaten
Zwei Benutzer werden in data.sql admin -> ROLE_ADMIN -> query_demo , wyf -> ROLE_USER initialisiert
3.Order-Service
3.1 Konfiguration des Ressourcendienstes
@Configuration@EnableResourceServerpublic class ResourceServerConfig extends ResourceServerConfigurerAdapter{ @Override public void configure(HttpSecurity http) throws Exception { http .csrf().disable() .exceptionHandling() .authenticationEntryPoint((request, response, authException) -> response.sendError (httpServletResponse.sc_unauthorized)) .and () .AuthorizeRequests () .Anlequest (). authenticated () .and () .htttpbasic (); }}3.2 Konfiguration von Benutzerinformationen
order-service ist ein einfacher Microservice, der auth-server zur Authentifizierung und Autorisierung verwendet. In seiner Konfigurationsdatei können Sie die Benutzerinformationen an auth-server -Adresse angeben:
Sicherheit: OAuth2: Ressource: ID: Order-Service-Benutzer-Info-URI: http: // localhost: 8080/uaa/user bevorzugt-token-info: false
3.3 Berechtigungs -Test -Controller
Zugriff ist mit authority ohne query-demo zugänglich, dh admin Benutzer
@RestControllerPublic Class DemoConTroller {@getMapping ("/Demo") @preaAthorize ("HasAuthority ('Query-Demo')") public String getDemo () {return "good"; }}4 Api-Gate
api-gateway hat in diesem Beispiel 2 Funktionen:
implicit verwenden4.1 Schalten Sie den CSRF aus und aktivieren Sie den OAuth2 -Client -Support
@Configuration @enableOAUTH2SSOPUblic class SecurityConfig erweitert WebSecurityConFigurerAdapter {@Override Protected void configure (httpsecurity http) löst die Ausnahme aus {http.csrf (). Disable (); }}4.2 Konfiguration
zuul: routes: uaa: path: /uaa/** sensitiveHeaders: serviceId: auth-server order: path: /order/** sensitiveHeaders: serviceId: order-service add-proxy-headers: truesecurity: oauth2: client: access-token-uri: http://localhost:8080/uaa/oauth/token user-authorization-uri: http: // localhost: 8080/uaa/oAuth/autorisieren client-id: webapp ressource: user-info-uri: http: // localhost: 8080/uaa/user bevorzugt-token-info: false
5 Demo
5.1 Client -Anrufe
Verwenden Sie Postman , um eine Anfrage an http://localhost:8080/uaa/oauth/token um access_token zu erhalten (für Administratorbenutzer, wie 7f9b54d4-fd25-4a2c-a848-ddf8f119230b )
Administrator Benutzer
WYF -Benutzer
5.2 WebApp-Anruf in Api-Gateway
Es sind noch keine Tests durchgeführt, und ich werde sie beim nächsten Mal hinzufügen.
6 Quellcodeadresse
https://github.com/wiselyman/uaa-zuul
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.