春の雲に基づきのOAuth2 + ZUUL認証と承認

春の雲に基づきの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サーバーの起動時にPostgresRedis

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)
                .userDetailsS​​ervice(userDetailsS​​ervice)// 若无、refresh_token会有UserDetailsS​​ervice要求さ错误
                .tokenStore(tokenStore())。
    } 

    @Override 
    公共 ボイド設定(AuthorizationServerSecurityConfigurerセキュリティ)がスロー例外{ 
        セキュリティ
                .tokenKeyAccess( "permitAll()" 
                .checkTokenAccess( "にisAuthenticatedを()" )。
    } 

    @Override 
    公共 ボイドのconfigure(ClientDetailsS​​erviceConfigurerクライアント)がスローされます例外{ 
        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 
    公共UserDetailsS​​ervice userDetailsS​​erviceを(){
         戻り 新しい)(DomainUserDetailsS​​erviceします。
    } 

    @Bean 
    公共PasswordEncoder passwordEncoder(){
         戻り 新しい)(BCryptPasswordEncoderします。
    } 

    @Overrideは、
    保護された ボイド設定(AuthenticationManagerBuilderのAUTH)をスロー例外{ 
        AUTH 
                .userDetailsS​​ervice(userDetailsS​​ervice()) 
                .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_demowyf- >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サービス間の相互

、事前にリクエストにアクセストークンなしで定義する必要クライアントを装うOAuth2FeignRequestInterceptorBeanを:

5デモ

5.1クライアントコール

使用して得られた送信要求(管理者ユーザとしてのPostmanhttp://localhost:8080/uaa/oauth/tokenaccess_token7f9b54d4-fd25-4a2c-a848-ddf8f119230b

  • 管理ユーザー



  • wyfユーザー



Webアプリケーションは、5.2のAPIゲートウェイを呼び出し、

一時的にテスト、次の補足をしませんでした。

 

 オープンソースコード

  オープンソースコードは、私のコードをクラウドにホスティングされています。

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

 

おすすめ

転載: www.cnblogs.com/senhelpa-vivo/p/11328160.html