En Spring Cloud se requiere OAUTH2 para implementar autenticación y autorización unificadas para múltiples microservicios. Al enviar un cierto tipo de grant type al OAUTH服务para la autenticación y autorización central, se obtiene access_token . Este token es confiable por otros microservicios. Podemos usar access_token para el acceso posterior, realizando así la autenticación unificada y la autorización para microservicios.
Este ejemplo proporciona cuatro partes principales:
discovery-service : módulo básico para el registro de servicios y el descubrimientoauth-server : Centro de certificación y autorización de OAUTH2order-service : microservicio ordinario, utilizado para verificar la autenticación y la autorizaciónapi-gateway : Border Gateway (todos los microservicios están detrás de él)Roles en OAuth2:
Resource Server : recursos autorizados para accederAuthotization Server : Centro de autorización de certificación OAUTH2Resource Owner : usuarioClient : clientes que usan API (como Android, iOS, aplicaciones web)Tipo de subvención:
Authorization Code : utilizado entre aplicaciones de servidorImplicit : utilizado en aplicaciones móviles o aplicaciones web (estas aplicaciones están en el dispositivo del usuario, como regular WeChat en el teléfono móvil para autenticar y autorizar)Resource Owner Password Credentials(password) : la aplicación es directamente confiable (todas desarrolladas por una empresa, y este ejemplo se utilizaClient Credentials : se usa en el acceso a la API de la aplicación.1. Entorno básico
Use Postgres como almacenamiento de cuentas, Redis como almacenamiento Token e inicie Postgres y Redis en el servidor usando 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 = pedido volúmenes: -/srv/docker/postgresql:/var/lib/postgresql: z
2.Servidor de autos
2.1 Configuración del servicio OAuth2
Redis se usa para almacenar token . Después de que el servicio se reinicia, no hay necesidad de volver a realizar token .
@Configuration @EnableauthorizationserververPublic Class AutorizationserverConfig extiende autorizationserverConfigurerAdapter {@aUtowired AuthenticationsManager AuthenticationManager; @AutoWired private redisConnectionFactory ConnectionFactory; @Bean public redistokenStore tokenStore () {return New RedistokenStore (ConnectionFactory); } @Override public void configure (autorizationserverEndpointSconfigurer endpoints) lanza la excepción {Endpoints .AuthenticationManager (AuthenticationManager) .TokenStore (TokenStore ()); } @Override public void configure (autorizationserverSecurityConfigurer Security) lanza la excepción {Security .TokenkeyAccess ("Permitall ()") .CheckTokenAccess ("isauthenticated ()"); } @Override public void configure (clientDetailsServiceConfigurer clientes) lanza la excepción {clientes.inmemory () .WithClient ("android") .Scopes ("xx") // Los ámbitos aquí son inútiles, puede configurar .Secret ("android") .AuthorizedGrantTypes ("PASSINTY", ",", ",", ",", ",", ",", ",", ",", ","). .and () .withClient ("webapp") .Scopes ("xx") .authorizedGrantTypes ("implícito"); }}2.2 Configuración del servicio de recursos
auth-server proporciona información del usuario, por lo que auth-server también es un Resource Server
@Configuration @EnablerSourceServerPublic Class ResourcesServerConfig extiende ResourceserverConfigurerAdapter {@Override public void Configure (httpsecurity http) lanza la excepción {http .csrf (). Disable () .ExceptionLing () .AuthenticationEntryPoint ((Solicitud, Respuesta, Autrexception) - - - - - - - -> - - - respuesta.sendError (httpservletResponse.sc_unauthorized)) .and () .AuthorizeRequests () .yyRequest (). Authenticated () .y () .httpbasic (); }} @RestControllerPublic Class UserController {@getMapping ("/user") Public Principal User (usuario principal) {return user; }}2.3 Configuración de seguridad
@ConfigurationPublic Class SecurityConfig extiende WebSecurityConfigurerAdapter {@Bean Public UserDetailsService UserDetailsService () {return New DomainUserDetailService (); } @Bean public PasswordEncoder PasswordEncoder () {return new bcRyptPassPassWordEnder (); } @Override Protected Void Configurar (AuthenticationManagerBuilder Auth) lanza la excepción {auth .userDetailsService (UserDetailsService ()) .passwordEncoder (contraseña en la contraseña ()); } @Bean public SecurityEvaluationContextExtension SecurityEvaluationContextExtension () {return New SecurityEvaluationContextension (); } // Sin contraseña Grant_type @Override @Bean Public AuthenticationManager AuthenticationManagerBean () lanza excepción {return super.authenticationManagerBean (); }}2.4 Diseño de permiso
La configuración de permisos de rol用户(SysUser)角色(SysRole) Sysrole)权限(SysAuthotity) es多对多. Cargar usuarios y permisos a través de DomainUserDetailsService .
2.5 Configuración
Spring: Perfiles: Active: $ {spring_profiles_active: dev} aplicación: name: auth-server jpa: open-in-view: verdadera base de datos: postgresql show-sql: true hibernate: ddl-auto: actualizar dataSource: plataforma: postes url: jdbc: postgresql: //192.168.1.1.1.1.1.140 Nombre de usuario: Wang Contraseña: Yunfei Driver-Class-Name: org.postgresql.driver Redis: Host: 192.168.1.140Server: Port: 9999eureka: Cliente: Servicio: Defaultzone: http: // $ {eureka.host:localhost}: $ {eureka.port: 8761} /eureka/logging.level.org.springframework.security: debuglogging.leve.org.springwork: debug ## es muy importante: oauth2: recursos: recursos: filter-order: 32.6 Datos de prueba
Dos usuarios se inicializan en data.sql admin -> ROLE_ADMIN -> query_demo , wyf -> ROLE_USER
3. Servicio de pedido
3.1 Configuración del servicio de recursos
@Configuration @EnablerSourceServerPublic Class ResourcesServerConfig extiende ResourceserverConfigurerAdapter {@Override public void Configure (httpsecurity http) lanza la excepción {http .csrf (). Disable () .ExceptionLing () .AuthenticationEntryPoint ((Solicitud, Respuesta, Autrexception) - - - - - - - -> - - - respuesta.sendError (httpservletResponse.sc_unauthorized)) .and () .AuthorizeRequests () .yyRequest (). Authenticated () .y () .httpbasic (); }}3.2 Configuración de información del usuario
order-service es un microservicio simple que utiliza auth-server para autenticación y autorización. En su archivo de configuración, puede especificar la información del usuario en auth-server :
Seguridad: OAuth2: Recurso: ID: Servicio de pedido User-Info-uri: http: // localhost: 8080/uaa/user-token-info: falso
3.3 Controlador de prueba de permiso
El acceso es accesible con authority sin query-demo , es decir, usuario admin
@RestControllerPublic Class Democontroller {@getMapping ("/Demo") @PreAuthorize ("Hasauthority ('Query-Demo')") public String getDemo () {return "Good"; }}4 API-Gateway
api-gateway tiene 2 funciones en este ejemplo:
implicit4.1 Apague CSRF y habilite el soporte del cliente OAUTH2
@Configuration @EnseableAuth2SSopublic Class SecurityConfig extiende WebSecurityConfigurerAdapter {@Override Protected void Configurure (httpsecurity http) lanza la excepción {http.csrf (). Disable (); }}4.2 Configuración
Zuul: rutas: uaa: ruta:/uaa/** SensitiveHeaders: ServiceId: Auth-Server Order: Rath:/Order/** SensitiveHeaders: ServiceId: Order-Service Add-Proxy-Headers: TrueseCurity: Oauth2: Client: Access-Token-Uri: Http: // LocalHost: 8080/uaa/oauth/Touth/tokenser- Authorization http: // localhost: 8080/uaa/oauth/autorize Client-id: WebApp Resource: User-Info-uri: http: // localhost: 8080/uaa/user-token-info: false: falso
5 demostración
5.1 Llamadas al cliente
Use Postman para enviar una solicitud a http://localhost:8080/uaa/oauth/token para obtener access_token (para usuarios administrativos, como 7f9b54d4-fd25-4a2c-a848-ddf8f119230b )
usuario administrativo
Usuario de WYF
5.2 Llamada de la aplicación web en API-Gateway
Todavía no se realizan pruebas, y las agregaré la próxima vez.
6 Dirección del código fuente
https://github.com/wiselyman/ua-zuul
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.