La primera configuración: zuul sólo es responsable de expedición, control de flujo, etc. (no responsable de la certificación)
1. Introducción
(1) servicio de descubrimiento de Eureka, cada servicio no está configurado hecho, basta con ver en esta certificación;
2 Configurar el servidor de autenticación
(1) añadir una dependencia (OAuth contiene ya la seguridad)
<dependency> <groupId> org.springframework.cloud </ groupId> <artifactId> primavera-nube-motor de arranque-OAuth2 </ artifactId> </ dependency>
Configuración de autenticación (2)
@Configuration clase pública MyConfig { // establecer el tipo de tratamiento de la información de usuario, aquí 123, un nombre de usuario una contraseña con el fin de la prueba arbitrariamente @Component myUserDetailsService clase estática pública los implementos de la UserDetailsService { @Autowired Privado El PasswordEncoder PasswordEncoder; @Override pública la DetallesUsuario loadUserByUsername (String nombre de usuario) lanza UsernameNotFoundException { return new nueva del usuario (nombre de usuario, passwordEncoder.encode ( "123"), AuthorityUtils.commaSeparatedStringToAuthorityList ( "usuarios con el ROLE_USER")); } } // servidor de autenticación @EnableAuthorizationServer @Configuration la AuthorizationServerConfigurerAdapter se extiende al público clase estática Autorización { @Autowired la AuthenticationManager la AuthenticationManager; @Autowired BCryptPasswordEncoder bCryptPasswordEncoder; @Autowired myUserDetailsService myUserDetailsService; // Para probar el certificado de cliente almacenada en la memoria (si la base de datos de producción a la tienda, oauth plantilla de base de datos estándar) @ Override pública Configurar vacío (Clientes ClientDetailsServiceConfigurer) throws Exception { clients.inMemory () .withClient ( "Cliente") // client_id .secret (bCryptPasswordEncoder.encode ( "123")) // client_secret .authorizedGrantTypes ( "authorization_code", "contraseña ") // permite elegir el tipo de licencia de cliente .scopes ( 'app'); // permiten mandatos configurar public void (AuthorizationServerSecurityConfigurer Seguridad) throws Exception { } // uso AuthenticationManager con el modo de contraseña, tokenstore disponibles producción Redis @ Override pública Configurar vacío (AuthorizationServerEndpointsConfigurer puntos finales) throws Exception { endpoints.authenticationManager (el AuthenticationManager) .tokenStore (nueva nueva InMemoryTokenStore ()) .userDetailsService (myUserDetailsService); } // token de configuración del estado consulta @ Override // utilizar un servidor de autenticación debe cumplir con seguridad @Configuration security.tokenKeyAccess ( "permitAll ()"); security.checkTokenAccess ( "isAuthenticated ()"); } } Public static class SecurityConfig extiende WebSecurityConfigurerAdapter { @Bean @ Override pública AuthenticationManager authenticationManagerBean () throws Exception { retorno super.authenticationManagerBean (); } @Bean BCryptPasswordEncoder pública passwordEncoder () { return new BCryptPasswordEncoder (); } //这里只验证是否带有símbolo的失败返回authenticationEntryPoint @ Override protegida void configure (HttpSecurity http) throws Exception { http .httpBasic (). Y () .csrf (). Desactivar () .exceptionHandling () .authenticationEntryPoint ((req, respectivamente, excepción) -> { resp.setContentType (MediaType.APPLICATION_JSON_UTF8_VALUE); .. resp.getWriter () escritura (nueva ObjectMapper () writeValueAsString (nuevo HashMap () {{ put ( "status", 0 ); put ( "error", "没有权限"); }})); .}) y () .authorizeRequests () anyRequest () autenticada ()..; } } // procesador de asignación de recursos, con el fin de acceder a los otros clientes información de acceso del usuario y similares @Configuration @EnableResourceServer ResourceServerConfiguration clase pública se extiende ResourceServerConfigurerAdapter { @ Override pública void configure (HttpSecurity http) throws Exception { http.csrf () Desactivar () ExceptionHandling () authenticationEntryPoint ((req, respectivamente, excepción) -> {... resp.setContentType (MediaType.APPLICATION_JSON_UTF8_VALUE); resp.getWriter () .write (. ObjectMapper nueva () writeValueAsString (nuevo HashMap () {{ put ( "status", 0); put ( "error", "没有权限"); }})); .}) y () authorizeRequests. () .anyRequest () autenticada ().; } } }
(3) suministrar información sobre clientes
@RestController ResourceWeb public class { @GetMapping ( "/ Miembro") pública del usuario principal (el miembro principal) { // obtener la información del usuario actual retorno miembro; } }
(4) Proceso
Aquí es la contraseña, el servicio general de llamadas en sí los recursos locales;
(Cliente, secreta) en nombre de una contraseña de la cuenta del cliente, en esta prueba, el cliente realmente dice que si el servicio local es un tercero, este último se aplican a la contraseña de la cuenta, puede obtener los recursos para llamar la autorización del usuario .;
(Nombre de usuario, contraseña) es el principal usuario de este servicio, todos los clientes el acceso a los recursos requiere un inicio de sesión de usuario local antes de que lleguen después de la debida autorización, el uso de la estrategia de seguridad de aterrizaje;
3. Configurar el servidor de recursos (recursos locales)
(1) Añadir la misma dependencia oauth
(2) configurar el servicio de autenticación remota:
Seguridad: OAuth2: recursos: usuario-info-URI: http: // localhost: 8082 / miembro prefieren-token-Info: falsa
@Configuration MyConfig public class { //配置资源服务器 @Configuration @EnableResourceServer ResourceServerConfiguration clase pública se extiende ResourceServerConfigurerAdapter { @ Override configurar public void (HttpSecurity http) throws Exception { http.csrf (). Desactivar (). HttpBasic (). Desactivar () .exceptionHandling () authenticationEntryPoint ((req, respectivamente, excepción) -> {. resp.setContentType (MediaType.APPLICATION_JSON_UTF8_VALUE); .. resp.getWriter () escritura (nueva ObjectMapper () writeValueAsString (nuevo HashMap () {{ put (" estado", 0); put ( "error", "没有权限"); }})); }) .Y () authorizeRequests () antMatchers ( "/ noauth") permitAll ()... .Y () authorizeRequests () anyRequest () autenticada ()...; } } }
4. Configuración zuul
Zuul: #routes: # Mechant: # -Servicio-ID: Mechant # ruta: / Mechant / ** Strip-prefijo: cuando cuando la verdadera # falsa, la dirección de petición -> MECHANT-> http: // localhost : 8081 / API / mechant / ping, devuelto 404 prefijo: solicitud de API / prefijo # sensible a los encabezados: # no escriba aquí no pueden llevar a la cabecera, y si la solicitud del cliente se hace con el X-ABC, entonces el X-ABC no se pasará a servicios derivados #ignoredHeaders: X-ABC # Si la solicitud del cliente se hace con el X-ABC, entonces el X-ABC se pasará a los correspondientes servicios. Pero si los servicios derivados serán filtrados y luego reenviado
5. Prueba
(1) token de aplicación (usando acceso zuul)
(2) utilizando el token (usando acceso zuul)