Em Spring Cloud OAUTH2 é necessário para implementar autenticação e autorização unificadas para vários microsserviços. Ao enviar um certo tipo de grant type ao OAUTH服务para autenticação e autorização central, access_token é obtido. Este token é confiável por outros microsserviços. Podemos usar access_token para acesso subsequente, realizando assim autenticação e autorização unificadas para microsserviços.
Este exemplo fornece quatro partes principais:
discovery-service : Módulo Básico para Registro e Descoberta de Serviçoauth-server : Centro de Autorização de Certificação e OAuth2order-service : Microservice Ordinário, usado para verificar a autenticação e autorizaçãoapi-gateway : Border Gateway (todos os microsserviços estão por trás dele)Papéis em Oauth2:
Resource Server : Recursos autorizados a acessarAuthotization Server : Centro de Autorização de Certificação OAuth2Resource Owner : usuárioClient : clientes que usam APIs (como Android, iOS, aplicativos da web)Tipo de concessão:
Authorization Code : usado entre aplicativos de servidorImplicit : usado em aplicativos móveis ou aplicativos da web (esses aplicativos estão no dispositivo do usuário, como regular o WeChat no telefone celular para autenticar e autorizar)Resource Owner Password Credentials(password) : o aplicativo é confiável diretamente (todos desenvolvidos por uma empresa, e este exemplo é usadoClient Credentials : usado no acesso da API do aplicativo.1. Ambiente básico
Use Postgres como armazenamento de contas, Redis como armazenamento Token e inicie Postgres e Redis no servidor usando docker-compose .
Redis: Imagem: Sameersbn/Redis: Portas mais recentes: - "6379: 6379" Volumes: -/srv/docker/redis:/var/lib/redis: z reinicialize: sempre postgresql: reiniciar: sempre imagem: sameersbn/pós -grresql: 9.6-2 portas: "42202: 5.43: 5: 5.42: Restart: Restart. Db_user = wang - db_pass = yunfei - db_name = volumes de ordem: -/srv/docker/postgreSql:/var/lib/postgreSql: z
2.Auth-Server
2.1 Configuração do serviço OAuth2
Redis é usado para armazenar token . Após o reinício do serviço, não há necessidade de obter token novamente.
@Configuration @EnableAuthorizationserverpublic Autorizações de classe Reconfig Extende AutorizaçõeserververConfigureRAdApter {@AUTOWIRED AUTHenticação privada AuthenticationManager; @Autowired Private RedisconnectionFactory ConnectionFactory; @Bean public RedistokenStore tokenstore () {return New RedistokenStore (ConnectionFactory); } @Override public void Configure (AuthorizationservendPointSconfigurer Endpoints) lança a Exceção {EndPoints .AuthenticationManager (AuthenticationManager) .TokenStore (Tokenstore ()); } @Override public void Configure (AutorizaçõeserverversCurityConfigurer Security) lança Exceção {Security .TokenKeyAccess ("Permitall ()") .CheckTokenAccess ("isauthenticated ()"); } @Override public void Configure (ClientDetailSServiceConfigurer clientes) lança Exceção {clients.inMemory () .WithClient ("Android") .Scopes ("xx") // Os escopos aqui são inúteis, você pode definir .Secret ("Android") .AuthorizedGrantGrantypGrantTyPrantTyPranty são inúteis, você pode definir .Secret ("Android") .authorizedGrantGrantypGrantTyPrantTyPrantTyPrantTyPrantTyPrantTyPrantTyPrantTyPrantTyPrantTyPrantTyPrantTyPrantTyPrantTyPrantTyPranty são inúteis, você pode definir. "refresh_token") .and () .WithClient ("webApp") .Scopes ("xx") .authorizedGrantTypes ("implícito"); }}2.2 Configuração do Serviço de Recursos
auth-server fornece informações do usuário, portanto, auth-server também é um Resource Server
@Configuration @EnableReSourceServerPublic Classe ResourceServerConfig Estende o ResourceServerConfigureRAdApter {@Override public void Configure (httpsecurity http) lança excepção {http .csrf (). Disable () .Exception) .AteChentIntyPoint (Http .csrf (). Response.SenderRor (httpServletResponse.sc_unauthorized)) .and () .authorizerequests () .anyRequest (). autenticado () .and () .httpbasic (); }} @RestControllerPublic Classe UserController {@GetMapping ("/Usuário") Principal Principal Usuário (usuário principal) {return user; }}2.3 Configuração de segurança
@ConfigurationPublic Class SecurityConfig estende o webcurityConfigureRAdApter {@Bean public userDetailSService UserDetailSService () {Return New DomainUserDetailSService (); } @Bean Public PasswordEncoder PasswordEncoder () {Return New BCryptPasswordEncoder (); } @Override Protected void Configure (AuthenticationManagerBuilder Auth) lança Exceção {auth .UserDetailSService (UserDEtailSService ()) .PasswordEncoder (PasswordEncoder ()); } @Bean Public SecurityEvaluationContexTextension SecurityEvalorationContexTextension () {return new SecurityEvalorationContexTextension (); } // sem senha Grant_type @Override @Bean Public AuthenticationManager AuthenticationManagerBean () lança Exceção {return super.authenticationManagerBean (); }}2.4 Projeto de permissão
A configuração de permissões de função用户(SysUser)角色(SysRole) SYSROLE)权限(SysAuthotity) é多对多. Carregue usuários e permissões através do DomainUserDetailsService .
2.5 Configuração
Spring: Perfis: Active: $ {spring_profiles_active: dev} aplicação: nome: auth-server jpa: abertura-in-view: true Database: pósgresql show-sql: true hibernate: ddl-auto: update datasource: plataform: pósgres url: jdbc: pósgresql: //192.192.10: Senha: Yunfei Driver-Class-Name: org.postgresql.driver Redis: host: 192.168.1.140Server: Port: 9999Eureka: Cliente: ServiceUrl: DefaultZone: http: // $ {eureka.host:localhost}: $ {eureka.port: 8761} /eureka/logging.level.org.springframework.Security: debuglogging.leve.org.springFramework: Debug ## Is muito importante2.6 Dados de teste
Dois usuários são inicializados em data.sql admin -> ROLE_ADMIN -> query_demo , wyf -> ROLE_USER
3.Vert-Service
3.1 Configuração do Serviço de Recursos
@Configuration @EnableReSourceServerPublic Classe ResourceServerConfig Estende o ResourceServerConfigureRAdApter {@Override public void Configure (httpsecurity http) lança excepção {http .csrf (). Disable () .Exception) .AteChentIntyPoint (Http .csrf (). Response.SenderRor (httpServletResponse.sc_unauthorized)) .and () .authorizerequests () .anyRequest (). autenticado () .and () .httpbasic (); }}3.2 Configuração de informações do usuário
order-service é um microsserviço simples que usa auth-server e autenticação e autorização. Em seu arquivo de configuração, você pode especificar as informações do usuário no endereço auth-server :
Segurança: OAuth2: Recurso: ID: Order-Service User-Info-Uri: http: // localhost: 8080/uaa/usuário prefere-token-info: false
3.3 Controlador de teste de permissão
O acesso é acessível com authority sem query-demo , ou seja, usuário admin
@RestControllerPublic Classe Democontroller {@GetMapping ("/Demo") @preathorize ("Hasathority ('query-deMo')) public string getDemo () {return" Good "; }}4 API-Gateway
api-gateway tem 2 funções neste exemplo:
implicit4.1 Desligue o CSRF e ative o suporte ao cliente OAuth2
@Configuration @enableoauth2sopublic Classe SecurityConfig Estende a WebSecurityConfigureRAdApter {@Override Protected void Configure (httpsecurity http) lança exceção {http.csrf (). Desabille (); }}4.2 Configuração
Zuul: Rotas: UAA: Path:/uaa/** SensiveHeaders: ServiceId: Ordem de autenticação: Path:/Order/** SensitiveHeaders: ServiceId: Order-Service add-proxy-headers: TRUESECURITY: OAuth2: Cliente: Access-Token-Uri: Http: // LocalHost: 808080: http: // localhost: 8080/uaa/oauth/autorize client-id: webapp Resource: User-Info-uri: http: // localhost: 8080/uaa/usuário prefere-token-info: false
5 demonstração
5.1 Chamadas do cliente
Use Postman para enviar uma solicitação para http://localhost:8080/uaa/oauth/token para obter access_token (para usuários administrativos, como 7f9b54d4-fd25-4a2c-a848-ddf8f119230b )
usuário administrador
Usuário da WYF
5.2 Chamada WebApp em Api-Gateway
Ainda não foram feitos testes, e eu os adicionarei na próxima vez.
6 Endereço do código -fonte
https://github.com/wiselyman/uaa-zuul
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.