春の雲に基づきのOAuth2認証と承認
Spring Cloud
使用する必要がOAUTH2
してマイクロの複数を実装するために統一された認証および承認サービスをOAUTH服务
、いくつかのタイプの送信grant type
得るために、集中認証と承認をaccess_token
、そしてこのトークンは、他のマイクロサービス信託の対象となり、我々はフォローアップすることができます訪問access_token
への統一された認証と認可のマイクロサービスを実現するためです。
この例では、4つの主要な部品を提供しています。
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
としてToken
使用し、ストレージdocker-compose
サーバーの起動時にPostgres
とRedis
。
Redisの:
画像:sameersbn / Redisの:最新
のポート:
- "6379:6379"
ボリューム:
- / SRV /ドッキングウィンドウ/ Redisの場合:/ var / libに/ Redisの:Zの
再起動:いつも
のPostgreSQL:
再起動:常に
画像:sameersbn / postgresqlの:9.6 -2
ポート:
- "5432:5432"
環境:
- DEBUG = FALSE
- 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)// 若无、refresh_token会有UserDetailsService要求さ错误 .tokenStore(tokenStore())。 } @Override 公共 ボイド設定(AuthorizationServerSecurityConfigurerセキュリティ)がスロー例外{ セキュリティ .tokenKeyAccess( "permitAll()" ) .checkTokenAccess( "にisAuthenticatedを()" )。 } @Override 公共 ボイドのconfigure(ClientDetailsServiceConfigurerクライアント)がスローされます例外{ clients.inMemory() .withClient( "アンドロイド" ) .scopes( "XX")// 此处的スコープ是无用的、可以随意设置 .secret( "アンドロイド" ) .authorizedGrantTypes( "パスワード"、「authorization_code 」、 "refresh_token" ) .AND() .withClient( "Webアプリケーション" ) .scopes( "XX" ) .authorizedGrantTypes( ""暗黙)。 } }
2.2リソースサービスの設定
auth-server
ユーザー情報を提供し、それがauth-server
またありますResource Server
@Configuration @EnableResourceServer パブリック クラス ResourceServerConfigは延びResourceServerConfigurerAdapter { @Override 公共 ボイド configureが(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のAUTH)をスロー例外{ AUTH .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-オート:更新
データソース:
プラットフォーム:Postgresの
URL: JDBC:postgresqlの://192.168.1.140:5432 /認証
ユーザ名:王
パスワード:yunfei
ドライバー・クラス名:org.postgresql.Driverの
Redisの:
ホスト: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 公共 ボイド configureが(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
この例では、2つの役割があります。
-
クライアント、使用としての地位
implicit
-
外部アプリのアクセスの方向として働きます
4.1 CSRF閉じて、オープンのOAuth2クライアントのサポート
@Configuration @ EnableOAuth2Sso パブリック クラス SecurityConfigは拡張WebSecurityConfigurerAdapter { @Overrideは、 保護された 空のconfigure(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の/認可 のwebapp:クライアントID のリソース: ユーザー情報-URIを:http:// localhostを:8080 / UAA /ユーザー 好む-トークン情報を:偽
4.3サービス間の相互
、事前にリクエストにアクセストークンなしで定義する必要クライアントを装うOAuth2FeignRequestInterceptor
Beanを:
5デモ
5.1クライアントコール
使用して得られた送信要求(管理者ユーザとしての)Postman
http://localhost:8080/uaa/oauth/token
access_token
7f9b54d4-fd25-4a2c-a848-ddf8f119230b
- 管理ユーザー
Webアプリケーションは、5.2のAPIゲートウェイを呼び出し、
一時的にテスト、次の補足をしませんでした。
オープンソースコード
オープンソースコードは、私のコードをクラウドにホスティングされています。
https://gitee.com/senhelpa-vivo/spring-cloud.git