第一の構成:等転送、フロー制御のための唯一の責任zuul(認証の責任ではありません)
1.はじめに
(1)ユーレカ発見サービス、各サービスが行われないように構成されている、ちょうどこの認定に見えます。
2を設定し、認証サーバ
(1)(OAuthのは、すでにセキュリティが含まれている)依存関係を追加します
<依存性> <のgroupId> org.springframework.cloud </のgroupId> <たartifactId>ばねクラウドスタータのOAuth2 </たartifactId> </依存>
(2)認証の設定
@Configuration パブリッククラスのMyConfig { //設定されたユーザ情報の処理の種類は、ここでは123、ユーザ名テスト任意の順序でパスワード @Component パブリック静的クラスmyUserDetailsServiceを実装UserDetailsService { @Autowired プライベートザPasswordEncoder PasswordEncoder; @Override 公衆UserDetails loadUserByUsername(文字列名)がUsernameNotFoundExceptionをスロー{ 新規新しいユーザー返す(ユーザ名、passwordEncoder.encodeを( "123")、 AuthorityUtils.commaSeparatedStringToAuthorityList( "ROLE_USER持つユーザ")); } } //認証サーバ @EnableAuthorizationServer @Configuration AuthorizationServerConfigurerAdapter認可静的クラスパブリック{延び @Autowired ; AuthenticationManager authenticationManager @Autowired BCryptPasswordEncoder bCryptPasswordEncoder; @Autowired myUserDetailsService myUserDetailsService; //メモリ(ストアへべき本番データベース、OAuthの標準的なデータベーステンプレート)に格納されたクライアント証明書をテストするために @Override 公開(ClientDetailsServiceConfigurerクライアント)のボイドの設定は、例外{スロー 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()) .userDetailsService(myUserDetailsService); } //トークンコンフィギュレーション状態クエリ @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アクセスを使用して)トークンを使用して