springcloud + zuul +のOAuth2統一認証サービスを実装します

第一の構成:等転送、フロー制御のための唯一の責任zuul(認証の責任ではありません)

1.はじめに

(1)ユーレカ発見サービス、各サービスが行われないように構成されている、ちょうどこの認定に見えます。

2を設定し、認証サーバ

(1)(OAuthのは、すでにセキュリティが含まれている)依存関係を追加します

<依存性> 
   <のgroupId> org.springframework.cloud </のgroupId> 
   <たartifactId>ばねクラウドスタータのOAuth2 </たartifactId> 
</依存>

  

(2)認証の設定

@Configuration 
パブリッククラスのMyConfig { 
 
    //設定されたユーザ情報の処理の種類は、ここでは123、ユーザ名テスト任意の順序でパスワード
    @Component 
    パブリック静的クラスmyUserDetailsS​​erviceを実装UserDetailsS​​ervice { 
        @Autowired 
        プライベートザPasswordEncoder PasswordEncoder; 
 
        @Override 
        公衆UserDetails loadUserByUsername(文字列名)がUsernameNotFoundExceptionをスロー{ 
            新規新しいユーザー返す(ユーザ名、passwordEncoder.encodeを( "123")、
                    AuthorityUtils.commaSeparatedStringToAuthorityList( "ROLE_USER持つユーザ")); 
        } 
    } 
 
    //認証サーバ
    @EnableAuthorizationServer 
    @Configuration
    AuthorizationServerConfigurerAdapter認可静的クラスパブリック{延び
 
        @Autowired 
        ; AuthenticationManager authenticationManager 
        @Autowired 
        BCryptPasswordEncoder bCryptPasswordEncoder; 
        @Autowired 
        myUserDetailsS​​ervice myUserDetailsS​​ervice; 
 
        //メモリ(ストアへべき本番データベース、OAuthの標準的なデータベーステンプレート)に格納されたクライアント証明書をテストするために
        @Override 
        公開(ClientDetailsS​​erviceConfigurerクライアント)のボイドの設定は、例外{スロー
            clients.inMemory()
                    .withClient( "クライアント")//のclient_id 
                    .secret(bCryptPasswordEncoder.encode( "123"))// client_secretを
                    .authorizedGrantTypes( "authorization_code"、 "パスワード ")//は、 クライアントライセンスの種類ができます
                    .scopes( "アプリを"); //任務ができるよう 
        ます。public voidのconfigure(AuthorizationServerSecurityConfigurerセキュリティ){例外がスローされます 
        }
 
        利用可能な生産Redisのtokenstoreパスワードモードと// authenticationManager使用
        @Override 
        公共ボイド設定(AuthorizationServerEndpointsConfigurerエンドポイント)が例外をスロー{ 
            endpoints.authenticationManager(authenticationManager)
                    .tokenStore(新しい新しいInMemoryTokenStore())
                    .userDetailsS​​ervice(myUserDetailsS​​ervice); 
        } 
 
        //トークンコンフィギュレーション状態クエリ
        @Override 
    //認証サーバを使用するには、セキュリティを遵守しなければなりません
    @Configuration
            security.tokenKeyAccess( "permitAll()"); 
            security.checkTokenAccess( "にisAuthenticated()"); 
        } 
    } 
 
    パブリック静的クラスSecurityConfigはWebSecurityConfigurerAdapter {延び
        @Bean 
        @Override 
        公衆AuthenticationManager authenticationManagerBean()がスロー例外{ 
            リターンsuper.authenticationManagerBean()。
        } 
 
        @Bean 
        公共BCryptPasswordEncoder passwordEncoder(){ 
            )(新しいBCryptPasswordEncoderを返します。
        } 
 
        //这里只验证是否带有トークン的失败返回authenticationEntryPoint 
        @Override 
        保護ボイド設定(HttpSecurity HTTP)例外{スロー
            HTTP 
                    .httpBasic()および()
                    .csrf()。無効()
                    .exceptionHandling()
                    .authenticationEntryPoint((REQ、RESP、例外) - > { 
                        resp.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); 
                        resp.getWriter()書き込み(新しいObjectMapper()writeValueAsString(新しいHashMapの(){{。。
                            プット( "ステータス"、0 ); 
                            プット( "エラー"、 "没有权限"); 
                        }})); 
                    })および()。
             .authorizeRequests()anyRequest()(認証)。
        } 
    } 
  
    //リソース割当てプロセッサ、他のクライアントのユーザのログイン情報等にアクセスするために
    @Configuration 
    @EnableResourceServer 
    パブリッククラスResourceServerConfigurationはResourceServerConfigurerAdapter {延び
        @Overrideを
        公共ボイド設定(HttpSecurity HTTP)例外{スロー
            http.csrf())(無効exceptionHandling()authenticationEntryPoint((REQ、RESP、例外) - > {。。。
                resp.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); 
                resp.getWriter() .WRITE(新しいObjectMapper()writeValueAsString(新しいHashMapの(){{ 
                    プット( "ステータス"、0); 
                    プット( "エラー"、 "没有权限"); 
                }})); 
            })および()authorizeRequests。 ()().anyRequest()認証されました。
        } 
    } 
}

  

(3)は、顧客情報を提供します

@RestController 
パブリッククラスResourceWeb { 
 
    @GetMapping(「/会員」)
    公衆プリンシパルユーザ(プリンシパルメンバー){ 
        //現在のユーザ情報取得
        リターン部材と、
    } 
}

(4)プロセス

  ここでは、パスワード、ローカル電話自体のリソースのための一般的なサービスです。

  (クライアント、秘密)クライアントアカウントのパスワードの代わりに、このテストでは、クライアントが実際にローカルサービスが第三者の場合、後者は、アカウントのパスワードに適用されることを、あなたはリソースがユーザー認証時に呼び出すために取得することができますと言います;

  (ユーザ名、パスワード)は、このサービスの主な利用者である彼らは成功した認証、セキュリティ戦略を着陸の使用後に取得する前に、リソースへのすべてのクライアントアクセスは、ローカルユーザのログインが必要です。

 

3.設定リソースサーバ(ローカルリソース)

(1)同じ依存関係のOAuthを追加します。

(2)は、リモート認証サービスを設定します。

セキュリティ:
  のOAuth2:
    リソース:
      ユーザー情報-URIます。http:// localhost:8082 /メンバー
      好む-トークン情報を:偽

  

@Configuration 
パブリッククラスのMyConfig { 
 
    //配置资源服务器
    @Configuration 
    @EnableResourceServer 
    パブリッククラスResourceServerConfigurationはResourceServerConfigurerAdapter {拡張
        @Override 
        ます。public voidのconfigure(HttpSecurityのhttpは)例外{スロー
            http.csrf()を()。無効。httpBasic()。無効() 。> { - ()authenticationEntryPoint((REQ、RESP、例外).exceptionHandling 
                ; resp.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
                resp.getWriter()、ライト(新ObjectMapper()writeValueAsString(新しいHashMapの(){{。。
                    「(プットをステータス」、0); 
                    置く( "エラー"、 "没有权限");  
                }}))。
            })
            .AND()authorizeRequests()antMatchers( "/ NOAUTH")permitAll()。。。
            .AND()authorizeRequests()anyRequest()認証されました()。。。。
        } 
    } 
}

4.設定zuul

Zuul:
  #routes:
  #Mechant: -サービス-ID:Mechantの
  #パス:/ Mechant / ** 
  ストリッププレフィックス:とき真#の偽の、要求アドレス- > MECHANT->のhttp:// localhostを :8081 / API / mechant /ピング、404返された
  接頭辞:/ APIリクエスト番号は、接頭辞
  敏感-ヘッダを:#は、ここでは書いていないヘッダを運ぶことはできません。クライアントの要求はX-ABCで作られている場合、その後、X-ABCは、下流のサービスに渡されることはありません
  #ignoredHeaders:クライアントの要求がX-ABCで作られている場合はX-ABCの#、その後、X-ABCはまだ下流のサービスに渡されます。しかし、下流のサービスを濾過し、転送される場合

  

5.テスト

(1)アプリケーション・トークン(zuulアクセスを使用して)

(2)(zuulアクセスを使用して)トークンを使用して

 

おすすめ

転載: www.cnblogs.com/liboware/p/12528755.html