springcloud + + zuul OAuth2 implementar el servicio de autenticación unificada

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)

 

Supongo que te gusta

Origin www.cnblogs.com/liboware/p/12528755.html
Recomendado
Clasificación