2017-11-01 12 views
1

のようになります。これはかなりよくある質問のようですが、文書化されたソリューションを実装するのは簡単ではありません。春のクラウドベアラヘッダは、

私はすべての着信要求に対してzuulプロキシ/ゲートウェイを持っており、これらの要求は異なるマイクロサービスに転送されます。それぞれの着信要求にはヘッダーに正しいベアラートークンが設定されています(これはフロントエンド(oktaから)で設定され検証され、Zuulをスキップして直接サービスに行くときに動作することが確認されています)サービス。

EdgeServiceApplication

@EnableHystrix 
@EnableZuulProxy 
@EnableEurekaClient 
@EnableOAuth2Sso 
@SpringBootApplication 
public class EdgeServiceApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(EdgeServiceApplication.class, args); 
    } 
} 

Zuul application.yml

server: 
    port: 8080 

logging: 
    level: 
    root: INFO 
    org.springframework.web: INFO 
    org.springframework.security: INFO 

zuul: 
    sensitiveHeaders: Cookie,Set-Cookie,Authorization 

そして、私のマイクロサービスに関する

@EnableEurekaClient 
@SpringBootApplication 
@EnableResourceServer 
public class InstanceServiceApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(InstanceServiceApplication.class, args); 
    } 
} 

私がしようとするマイクロに要求を送信Zuulを通じて私は401の応答を得るサービス。

私のマイクロサービスに次のBeanを追加すると、Zuulからリクエストが来たときにAuthorizationヘッダーが設定されていないことがわかりますが、直接呼び出すときに設定されていることがわかります。私は春に新たなんだ

@Bean 
public FilterRegistrationBean requestDumperFilter() { 
    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    Filter requestDumperFilter = new RequestDumperFilter(); 
    registration.setFilter(requestDumperFilter); 
    registration.addUrlPatterns("/*"); 
    return registration; 
} 

ので、ちょうど私がどこか.ymlファイルで何かのobviouseを見逃していることを望ん?

現在の依存関係

buildscript { 
ext { 
    springBootVersion = '1.5.8.RELEASE' 
} 
repositories { 
    mavenCentral() 
} 
dependencies { 
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
    classpath('io.spring.gradle:dependency-management-plugin:0.5.4.RELEASE') 
} 
} 

dependencies { 
    compile('org.springframework.cloud:spring-cloud-starter-eureka') 
    compile('org.springframework.cloud:spring-cloud-starter-config') 
    compile('org.springframework.cloud:spring-cloud-starter-zuul') 
    compile('org.springframework.cloud:spring-cloud-starter-ribbon') 

    compile('org.springframework.boot:spring-boot-starter') 
    compile('org.springframework.boot:spring-boot-starter-web') 

    compile('org.springframework.boot:spring-boot-starter-data-rest') 
    compile("org.springframework.boot:spring-boot-starter-actuator") 
    compile('org.springframework.boot:spring-boot-starter-websocket') 

    compile('org.springframework.security.oauth:spring-security-oauth2:2.2.0.RELEASE') 
    compile('org.springframework.cloud:spring-cloud-security:1.2.1.RELEASE') 
} 

更新:

私はまだすべての要求に401を打ってる提案として私のアプリケーションを変更した後。

2017-11-02 11:03:05.697 ERROR 7139 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException: 401 null] with root cause 

org.springframework.web.client.HttpClientErrorException: 401 null 
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:78) ~[spring-web-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700) 

私はそこに何か間違いがあると考え始めています。私はマイクロサービス上のように見えるSecurityConfigクラス(生産のために安全ではないが、私が知っている)

@Configuration 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http.csrf().disable().antMatcher("/**") 
       .authorizeRequests() 
       .anyRequest().permitAll(); 
    } 

    @Bean 
    public CorsConfigurationSource corsConfigurationSource() { 
     final CorsConfiguration configuration = new CorsConfiguration(); 
     configuration.setAllowedOrigins(ImmutableList.of("*")); 
     configuration.setAllowedMethods(ImmutableList.of("*")); 
     configuration.setAllowedHeaders(ImmutableList.of("*")); 
     configuration.setAllowCredentials(true); 

     final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 

     source.registerCorsConfiguration("/**", configuration); 

     return source; 
    } 
} 

のみセキュリティ設定を持っている

@EnableEurekaClient 
@SpringBootApplication 
@EnableResourceServer 
public class InstanceServiceApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(InstanceServiceApplication.class, args); 
    } 

    @EnableGlobalMethodSecurity(prePostEnabled = true) 
    protected static class GlobalSecurityConfiguration extends GlobalMethodSecurityConfiguration { 
     @Override 
     protected MethodSecurityExpressionHandler createExpressionHandler() { 
      return new OAuth2MethodSecurityExpressionHandler(); 
     } 
    } 

    @Bean 
    protected ResourceServerConfigurerAdapter resourceServerConfigurerAdapter() { 
     return new ResourceServerConfigurerAdapter() { 
      @Override 
      public void configure(HttpSecurity http) throws Exception { 
       http.authorizeRequests() 
         .anyRequest().authenticated(); 
      } 
     }; 
    } 

    @Bean 
    public FilterRegistrationBean requestDumperFilter() { 
     FilterRegistrationBean registration = new FilterRegistrationBean(); 
     Filter requestDumperFilter = new RequestDumperFilter(); 
     registration.setFilter(requestDumperFilter); 
     registration.addUrlPatterns("/*"); 
     return registration; 
    } 
} 

更新#2:

ログリクエストヘッダーを外しても、まだ許可がありません。

2017-11-02 11:25:24.133 INFO 7381 --- [nio-8080-exec-2] s.s.e.s.c.LoggingRequestInterceptor  : URI   : http://instance-service 
2017-11-02 11:25:24.133 INFO 7381 --- [nio-8080-exec-2] s.s.e.s.c.LoggingRequestInterceptor  : Method  : GET 
2017-11-02 11:25:24.133 INFO 7381 --- [nio-8080-exec-2] s.s.e.s.c.LoggingRequestInterceptor  : Headers  : {Accept=[text/plain, application/json, application/*+json, */*], Content-Length=[0]} 
2017-11-02 11:25:24.133 INFO 7381 --- [nio-8080-exec-2] s.s.e.s.c.LoggingRequestInterceptor  : Request body: 

更新#3:

私はhttps://github.com/peavers/zuul-oauth-passthrough ...また、認証ヘッダを取り除き、迅速サンプルアプリケーションを作った - うまくいけば、誰かが私が間違ってやった見つけることができます。official documentationから

+0

どのバージョンのスプリングクラウドを使用しますか? –

+0

@DanyloZatorsky申し訳ありませんが、私は言及すべきでした。私の依存関係を質問に追加しました。 –

+0

私が知る限り、spring-cloud依存関係はspring-boot依存関係から切り離されています。私はあなたのケースでクラウドスターターのバージョンについてはわかりません。 'gradle dependencies'コマンドの出力を表示できますか? –

答えて

2

sensitiveHeadersはブラックリストであり、デフォルトは空ではありません、あなたは 明示的に設定する必要がありますので、 Zuulは、すべてのヘッダを送信するようにするには(「無視」するものを除きます)空のリストに追加します。これは、 がバックエンドにCookieまたは認証ヘッダーを渡したい場合に必要です。

したがって、sensitiveHeadersは逆です。これらは、ヘッダーがバックエンドにダウンストリームされることを防ぎます。代わりに、リストにAuthorizationヘッダーを追加するあなたは、このようにそこからそれを削除する必要があります。

zuul: 
    sensitiveHeaders: Cookie,Set-Cookie 

またはこのような(あなたには、いくつかの理由のためにあなたのバックエンドにdownstreamedするためにクッキーを必要とする場合(私はあなたがないことを望みます)):

zuul: 
    sensitiveHeaders: 
+0

私の 'application.yml'ファイルに' zuul: sensitiveHeaders:Cookie、Set-Cookie'を設定すると、残念なことに応答に感謝します。私はまだ同じ401応答を打ちます –