기반 OAUTH2 + 봄 클라우드에서 ZUUL 인증 및 권한 부여

봄 클라우드에 기반 OAUTH2 인증 및 권한 부여

Spring Cloud사용할 필요 OAUTH2통해 마이크로 복수를 구현하는 통합 인증 및 권한 부여 서비스를하기 위해 OAUTH服务어떤 종류의 전송 grant type중앙 집중식 인증 및 취득 할 수있는 권한을 access_token하고,이 토큰은 다른 마이크로 서비스 신뢰에 따라, 우리는 후속 수 있습니다 방문 access_token에를 단일화 된 인증 및 권한 부여 마이크로 서비스를 달성하기 위해서이다.

이 예는 네 개의 주요 부품을 제공합니다 :

 

  • eureka: 기본 모듈 서비스 등록 및 검색
  • auth: OAUTH2 인증 기관
  • account: 사용되는 일반 마이크로 서비스는 인증 및 권한 부여를 확인합니다
  • gateway: 국경 게이트웨이 (마이크로 서비스는 모든 뒤에 있습니다)

OAUTH2 역할 :

  • Resource Server: 리소스에 액세스 할 수있는 권한
  • Authotization Server: OAUTH2 인증 기관
  • Resource Owner: 사용자
  • Client: API를 사용하여 클라이언트 (예를 들어, 안드로이드, IOS, 웹 응용 프로그램)

유형을 부여합니다 :

  • authorization_code:
  • implicit:
  • password:
  • refrsh_token:

1. 기본 환경

사용 Postgres, 저장 계정으로 Redis는 AS Token저장, 사용하는 docker-compose서버 시작에 PostgresRedis.

레디 스 : 
  이미지 : sameersbn / 레디 스 : 최신 
  포트 : 
    - "6379 : 6379" 
  볼륨 : 
    - / SRV / 고정 표시기 / 레디 스의 경우 : / var / lib 디렉토리 / 레디 스 : Z의 
  재시작 : 항상 

PostgreSQL의 : 
  재시작 : 항상 
  이미지 : sameersbn / PostgreSQL의 : 9.6 -2 
  포트 : 
    - "5432 : 5432" 
  환경 : 
    - DEBUG = 거짓 

    - DB_USER = 왕 
    - DB_PASS은 = yunfei 
    - DB_NAME = 주문 
  볼륨 : 
    - / SRV / 고정 표시기 / PostgreSQL의 경우 : / var / lib 디렉토리 / PostgreSQL의 : Z

2.auth 서버

2.1 OAuth2를 서비스 구성

Redis그것은 저장하는 데 사용되는 token서비스가 획득 한 다시없이 다시 시작 후 token.

@Configuration 
@EnableAuthorizationServer 
공공  클래스 AuthorizationServerConfig이 확장 AuthorizationServerConfigurerAdapter는 { 
    @Autowired 
    개인 의 AuthenticationManager의 AuthenticationManager를; 
    @Autowired 
    개인 RedisConnectionFactory의 ConnectionFactory를을; 


    @Bean 
    공공 RedisTokenStore tokenStore는 () {
         반환  RedisTokenStore (ConnectionFactory에를); 
    } 


    @Override 
    공공  무효 구성 (AuthorizationServerEndpointsConfigurer 엔드 포인트) 가 발생 예외 { 
        엔드 포인트를
                .authenticationManager는 (의 AuthenticationManager) 
                .userDetailsService (UserDetailsService도)를 // 若无,会有UserDetailsService도는错误필요 refresh_token도 
                .tokenStore (tokenStore ()); 
    } 

    @Override 
    공공  무효 구성 (AuthorizationServerSecurityConfigurer 보안) 발생 예외 { 
        보안 
                .tokenKeyAccess ( "permitAll ()" ) 
                .checkTokenAccess ( "IsAuthenticated는은 ()" ); 
    } 

    @Override 
    공공  무효 구성은 (ClientDetailsServiceConfigurer 클라이언트)가 발생합니다예외 { 
        clients.inMemory () 
                .withClient ( "안드로이드" ) 
                .scopes ( "XX") // 此处的스코프是无用的,可以随意设置 
                .secret ( "안드로이드" ) 
                .authorizedGrantTypes ( "암호", "authorization_code ","refresh_token도 " ) 
            .and () 
                .withClient ( "웹 애플리케이션 " ) 
                .scopes ( "XX " ) 
                .authorizedGrantTypes ( " "암시 적 ); 
    } 
}

2.2 자원 서비스 구성

auth-server이 사용자 정보를 제공합니다 auth-server또한입니다Resource Server

@Configuration 
@EnableResourceServer 
공공  클래스 ResourceServerConfig가 확장 ResourceServerConfigurerAdapter가 { 

    @Override 
    공공  무효 구성 (HttpSecurity HTTP) 가 발생 예외 { 
        HTTP 
                .csrf () () 해제합니다. 
                .exceptionHandling () 
                .authenticationEntryPoint ((요청, 응답, authException을) -> response.sendError (HttpServletResponse.SC_UNAUTHORIZED)) 
            .and () 
                .authorizeRequests () 
                .anyRequest (). (인증) 
            .and ()
                .httpBasic (); 
    }
}
@RestController
 공공  클래스 UserController { 

    @GetMapping ( "/ 사용자" )
     공공 교장 사용자 (기본 사용자) {
         반환 사용자; 
    } 
}

2.3 보안 구성

@Configuration
 공공  클래스 의 SecurityConfig는 확장 WebSecurityConfigurerAdapter가 { 



    @Bean 
    공공 의 UserDetailsService의 UserDetailsService의 () {
         반환  ) (DomainUserDetailsService을; 
    } 

    @Bean 
    공개 되는 PasswordEncoder의되는 PasswordEncoder () {
         반환  ) (BCryptPasswordEncoder을; 
    } 

    @Override가 
    보호  무효 구성 (AuthenticationManagerBuilder의 인증)를 던졌습니다 예외 { 
        인증의 
                .userDetailsService (UserDetailsService의 ()) 
                .passwordEncoder (되는 PasswordEncoder ()); 
    } 

    @Bean
     공공 SecurityEvaluationContextExtension securityEvaluationContextExtension는 () {
         반환  ) (SecurityEvaluationContextExtension을; 
    } 

    // 不定义没有암호 grant_type 
    @Override 
    @Bean 
    공공 의 AuthenticationManager authenticationManagerBean ()가 발생 {예외를
         반환  슈퍼 ) (.authenticationManagerBean; 
    } 
    


}

2.4 디자인 기관

사용 用户(SysUser)<-> 角色(SysRole)<-> 权限(SysAuthotity)구비 서로 관계 多对多. 으로 DomainUserDetailsService 사용자 및 사용 권한을로드.

2.5 구성

봄 : 
  프로파일 : 
    활성 : $ {SPRING_PROFILES_ACTIVE : DEV} 
  응용 프로그램 : 
      이름 : 인증 서버 

  JPA : 
    에서보기 오픈 : 사실 
    데이터베이스 : PostgreSQL의 
    쇼-SQL : 사실 
    최대 절전 모드 : 
      DDL-자동 : 업데이트 
  데이터 소스 : 
    플랫폼 : 포스트 그레스의 
    URL : JDBC : PostgreSQL의 : //192.168.1.140 : 5432 / 인증 
    사용자 이름 : 왕의 
    비밀 : yunfei의 
    드라이버 클래스 이름 : org.postgresql.Driver의 
  레디 스 : 
    호스트 : 192.168.1.140 

서버 : 
  포트 : 9999 


유레카 : 
  클라이언트 : 
    것은 serviceUrl :
      defaultZone : HTTP : // $ {eureka.host:localhost} : $ {eureka.port : 8761} / 유레카 /



logging.level.org.springframework.security : DEBUG의 

logging.leve.org.springframework : DEBUG


2.6 테스트 데이터

data.sql두 명의 사용자를 초기화 admin-> ROLE_ADMIN-> query_demo, wyf->ROLE_USER

3.account

3.1 자원 서비스 구성

@Configuration 
@EnableResourceServer 
공공  클래스 ResourceServerConfig가   확장 ResourceServerConfigurerAdapter가 { 

    @Override 
    공공  무효 구성 (HttpSecurity HTTP) 가 발생 예외 { 
        HTTP 
                .csrf () () 해제합니다. 
                .exceptionHandling () 
                .authenticationEntryPoint ((요청, 응답, authException을) -> response.sendError (HttpServletResponse.SC_UNAUTHORIZED)) 
            .and () 
                .authorizeRequests () 
                . .anyRequest () (인증)  
            .and ()
                .httpBasic (); 
    }
}

3.2 사용자 구성

계정을 이용하여, 간단한 마이크로 서비스 auth-server의 인증 및 권한 부여, 구성 파일에 사용자 지정 정보 auth-server의 어드레스 작성자 :

보안 : 
  OAuth2를 : 
    자원 : 
      ID : 순서 - 서비스 
      사용자 -info-URI : HTTP : // localhost를 : 8080 / UAA / 사용자 
      선호 - 토큰 정보를 : 거짓

3.3 권한 테스트 컨트롤러

적이 authority없는 query-demo, 즉 액세스 할 수 admin사용자

@RestController
 공공  클래스 DemoController { 
    @GetMapping ( "/ 데모" ) 
    @PreAuthorize ( "hasAuthority ( '쿼리 데모')" )
     공공 문자열 getDemo () {
         반환 "좋은" ; 
    } 
}

4 API 게이트웨이

api-gateway이 예에서는 두 가지 역할이 있습니다 :

  • 클라이언트, 사용과 같은 자체implicit

  • 외부 응용 프로그램 액세스의 방향으로 행동

4.1 CSRF 폐쇄와 개방으로 OAuth2 클라이언트 지원

@Configuration 
@ EnableOAuth2Sso 
공공  클래스 의 SecurityConfig는 확장 WebSecurityConfigurerAdapter { 
    @Override가 
    보호  무효 구성 (HttpSecurity HTTP) 발생을 예외 { 

        . http.csrf () 해제 (); 

    } 

}

4.2 구성

zuul : 
  경로 : 
    UAA : 
      경로 : / UAA / ** 
      : sensitiveHeaders 
      서비스 id : 인증 서버 
    순서 : 
      경로 : / 주문 / ** 
      sensitiveHeaders : 
      서비스 id : 주문 서비스 
  추가 프록시 헤더 : 진정한 

보안 : 
  OAuth2를 : 
    클라이언트 : 
      액세스 -token-URI : HTTP : // localhost를 : 8080 / UAA / OAuth를 / 토큰 
      사용자 인증-URI : HTTP : // localhost를 : 8080 / UAA / OAuth를 / 인증 
      클라이언트 ID를 : 웹 애플리케이션 
    자원을 : 
      사용자 정보-URI를 : 에 http : // localhost를  : 8080 / UAA / 사용자
      선호-토큰 정보 : 거짓

4.3 서비스 사이의 상호 변조

미리 요청에 액세스 토큰없이 클라이언트를 가장하다, 필요가 정의하는 OAuth2FeignRequestInterceptor빈을 :

5 데모

5.1 클라이언트 호출

사용 얻어진 송신 요구 (AS 관리 사용자 )Postmanhttp://localhost:8080/uaa/oauth/tokenaccess_token7f9b54d4-fd25-4a2c-a848-ddf8f119230b

  • 관리자 사용자



  • wyf 사용자



웹 애플리케이션 5.2 API 게이트웨이에서 호출

임시 테스트, 다음 보충을하지 않았다.

 

 오픈 소스 코드

  오픈 소스 코드 내 코드를 클라우드 호스팅되었습니다

               https://gitee.com/senhelpa-vivo/spring-cloud.git

 

추천

출처www.cnblogs.com/senhelpa-vivo/p/11328160.html