2016-05-05 29 views
9

chcę mój serwer być ResourceServer, który może przyjąć okaziciela token dostępuWiosna Boot 1.3.3 @EnableResourceServer i @ EnableOAuth2Sso jednocześnie

Jednakże jeżeli taki znak nie istnieje, chcę użyć OAuth2Server do uwierzytelnienia mojego użytkownika.

staram się robić jak:

@Configuration 
@EnableOAuth2Sso 
@EnableResourceServer 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{ 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().anyRequest().authenticated(); 
    } 
} 

Jednakże w tym przypadku tylko @EnableResourceServer prac adnotacji. Zwraca

Full authentication is required to access this resource 

I nie przekierowuje mnie na stronę logowania

mówiłem, że @Order jest ważna, jeśli dodać @Order(0) adnotacji będę przekierowanie do strony logowania, jednak ja nie mogę uzyskać dostępu do mojego zasobu za pomocą atrybutu access_token w nagłówku HTTP:

Authorization : Bearer 142042b2-342f-4f19-8f53-bea0bae061fc 

Jak mogę osiągnąć mój cel? Chcę, aby korzystał jednocześnie z tokenu dostępu i SSO.

Dzięki ~

Odpowiedz

4

Korzystanie z obu konfiguracji na tej samej prośbie byłoby niejednoznaczne. Nie może być pewne rozwiązanie, ale bardziej jasne zdefiniowanie oddzielnych grup żądanie:

  • OAuth2Sso: dla użytkowników pochodzących z przeglądarki, chcemy przekierować je do dostawcy uwierzytelniania za symboliczną
  • ResourceServer: zwykle żądań API, pochodzących z tokena dostali skądś (najprawdopodobniej od tego samego dostawcy uwierzytelniania)

dla osiągnięcia tego celu, należy oddzielić konfiguracje z prośbą dopasowującego:

@Configuration 
@EnableResourceServer 
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 

    @Bean("resourceServerRequestMatcher") 
    public RequestMatcher resources() { 
     return new AntPathRequestMatcher("/resources/**"); 
    } 

    @Override 
    public void configure(final HttpSecurity http) throws Exception { 
     http 
      .requestMatcher(resources()).authorizeRequests() 
      .anyRequest().authenticated(); 
    } 

} 

i uwzględniają je z łańcucha filtrów SSO:

@Configuration 
@EnableOAuth2Sso 
public class SsoSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Autowired 
    @Qualifier("resourceServerRequestMatcher") 
    private RequestMatcher resources; 

    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     RequestMatcher nonResoures = new NegatedRequestMatcher(resources); 
     http 
      .requestMatcher(nonResoures).authorizeRequests() 
      .anyRequest().authenticated(); 
    } 
} 

i umieścić wszystkie swoje zasoby pod /resources/**

oczywiście w tym przypadku zarówno użyje tego samego OAuth2 konfigurację (accessTokenUri, jwt.key-value itp.)

UPDATE1:

Właściwie można osiągnąć swój pierwotny cel za pomocą tego żądania dopasowywania do powyższej konfiguracji:

new RequestHeaderRequestMatcher("Authorization") 

Update2: (Objaśnienie @ sid-Morad komentarza)

Wiosna Bezpieczeństwa tworzy filtr łańcuch dla każdej konfiguracji. Element dopasowujący żądanie dla każdego łańcucha filtrów jest oceniany w kolejności konfiguracji. WebSecurityConfigurerAdapter ma domyślną kolejność 100, a ResourceServerConfiguration jest domyślnie sortowana 3. Co oznacza, że ​​najpierw jest oceniany matcher wniosku. Ta kolejność może być zmieniona dla tych konfiguracjach, takich jak:

@Configuration 
@EnableResourceServer 
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 

    @Autowired 
    private org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfiguration configuration; 

    @PostConstruct 
    public void setSecurityConfigurerOrder() { 
     configuration.setOrder(3); 
    } 
... 
} 

 

@Configuration 
@EnableOAuth2Sso 
@Order(100) 
public class SsoSecurityConfiguration extends WebSecurityConfigurerAdapter { 
... 
} 

Więc tak, prośba dopasowujący nie jest potrzebna do SsoSecurityConfiguration w powyższej próbie. Ale dobrze znać powody za :)

+0

Twoja odpowiedź była pomocna dla mnie, dzięki! i chciałbym wskazać na "nowy element NegatedRequestMatcher (zasoby)" w moim przypadku nie było konieczne. –

+0

Cześć, dzięki! Skierowałem Twój komentarz w sekcji UPDATE2 mojego oryginalnego wpisu. – plajko