spring-security - 이란 - 넷플릭스 유레카




스프링 클라우드 Zuul 프록시를 사용하는 Spring OAuth 인증 서버 (2)

내가 아는 한, spring-cloud-security ( EnableOauth2Sso 부분 용)과 spring-cloud (zuul 용)를 이해하면 zuul을 사용하여 권한 서버에 대한 호출을 프록시 할 수 없습니다. spring-cloud-security Zuul 라우팅의 로직을 독립적으로 (그리고 고려하기 전에) 안전하게 보호한다는 주된 이유가 있습니다.

즉, Dave Syer의 OAuth2 예제에서 나온 예제 구성 인 spring.oauth2.client.* 설정

spring:
  oauth2:
    client:
      accessTokenUri: http://localhost:9999/uaa/oauth/token
      userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
      clientId: acme
      clientSecret: acmesecret

Zuul의 루트에 대한 액세스를 허용 하기 전에 고려됩니다 zuul.routes.*

또한이 설정은 클라이언트 에이전트 가 두 개의 쿠키를 저장할 수있게합니다. 하나는 게이트웨이 용이고 다른 하나는 권한 부여 서버용입니다.

이게 도움이 되길 바란다.

현재 마이크로 서비스 아키텍처를 기반으로하는 응용 프로그램을 개발 중입니다. Spring Cloud Netfix의 Zuul Server를 사용하여 구현 된 API-Gateway를 사용하여 마이크로 서비스에 요청을 라우팅합니다.

모든 서비스에 대해 싱글 사인온 (single sign on)을 실현하기 위해 현재 Spring Cloud Security를 ​​사용하여 설정된 OAuth2 서버를 작업 중입니다. 서버는 기본적으로 Dave Syer의 Repo에있는 구현의 복사 및 과거 버전입니다. https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver

가장 큰 차이점은 Zuul 프록시를 통해 OAuth 서버로 요청을 라우팅하려는 것입니다. 이렇게하면 OAuth Server를 직접 노출 할 필요가 없으며 Login Server를 동적으로 추가 및 제거 할 수 있습니다.

문제는이 설정을 올바르게 구성하는 방법을 이해할 수 없기 때문입니다. OAuth 서버에서 보호 된 리소스에 액세스하려고하면 로그인 페이지로 전달됩니다. 이것은 예상대로입니다. 하지만 포워딩 할 때 사용되는 호스트 이름과 포트를 설정하는 방법을 알 수는 없습니다. 내가 원하는 것은 서버가 Zuul 서버의 엔드 포인트로 전달하여 OAuth 서버로 다시 프락시 될 것입니다. (Zuul API-Gateway는 클라이언트가 지금까지 말한 유일한 서버 여야합니다. 다른 모든 것은 숨겨집니다.)

호스트와 포트는 LoginUrlAuthenticationEntryPointHttpServletRequest 에서 읽습니다. 그러나 서버가 보는 요청은 Zuul 프록시가 전송 한 요청입니다. 그래서 프록시의 끝점이 아닌 내부 IP로 전달됩니다.

내 Zuul 프록시의 절대 URL에 WebSecurityConfigurerAdapter.configure(HttpSecurity) 의 로그인 페이지 URL을 설정하려고했습니다. 하지만 이로 인해 내 애플리케이션에서 너무 많은 리디렉션에 대해 불만을 토로했습니다. (거기에 루프가 생길 수 있습니다.)

이것을 설정하는 가장 좋은 방법은 무엇입니까?


업데이트 : POC는 여기에서 찾을 수 있습니다. https://github.com/kakawait/uaa-behind-zuul-sample

setup ( zuul 서버에서)을 시도해 보셨습니까?

zuul:
  routes:
    uaa-service:
      path: /uaa/**
      stripPrefix: false

security:
  # Disable Spring Boot basic authentication
  basic:
    enabled: false
  oauth2:
    sso:
      loginPath: /login
    client:
      accessTokenUri: https://<zuul hostname>/uaa/oauth/token
      userAuthorizationUri: https://<zuul hostname>/uaa/oauth/authorize
      ...

기본적으로 내 프로젝트에서 작동합니다. /uaa/oauth/token route에서 CSRF 보호를 비활성화하는 것입니다.

인증 서버가 켜져 있어야합니다.

server:
  # Use different context-path to avoid session cookie overlapping
  context-path: /uaa

Spring-Cloud.Brixton.M3 사용하여 테스트 Spring-Cloud.Brixton.M3

@thomas-letsch 감사드립니다. 다음과 같이 보안을 조정해야합니다 (샘플).

public void configure(HttpSecurity http) throws Exception { 
    http.logout().and()
        .antMatcher("/**").authorizeRequests() 
        .antMatchers("/index.html", "/home.html", "/", "/uaa/oauth/**").permitAll() 
        .anyRequest().authenticated().and() 
        .csrf().csrfTokenRepository(getCSRFTokenRepository()).ignoringAntMatchers("/uaa/‌​oauth/token").and() 
        .addFilterAfter(createCSRFHeaderFilter(), CsrfFilter.class); 
}