봄 클라우드에 기반 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
서버 시작에 Postgres
와 Redis
.
레디 스 :
이미지 : 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 관리 사용자 )Postman
http://localhost:8080/uaa/oauth/token
access_token
7f9b54d4-fd25-4a2c-a848-ddf8f119230b
- 관리자 사용자
웹 애플리케이션 5.2 API 게이트웨이에서 호출
임시 테스트, 다음 보충을하지 않았다.
오픈 소스 코드
오픈 소스 코드 내 코드를 클라우드 호스팅되었습니다
https://gitee.com/senhelpa-vivo/spring-cloud.git