2016-01-17 221 views
0

我正在使用Spring Boot,我希望我的應用程序能夠託管Oauth2資源服務器以訪問同一服務器上的api端點。我還需要通過表單登錄與安全頁面建立一個Web界面。Spring Boot安全表單登錄和Oauth2資源服務器

例如我有api endpoints/api/v1/**,其中請求只能通過從我的oauth2資源服務器獲取令牌來完成。

此外還有像/ account/**這樣的端點,用戶需要通過表單登錄。

現在所有這些都需要在一個Spring Boot實例中。

我WebSecurityConfig文件:

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .authorizeRequests() 
     .antMatchers("/account/**").authenticated() 
     .and() 
     .httpBasic(); 
} 
} 

在我Oauth2SecurityConfig我:

@Configuration 
@EnableResourceServer 
protected static class ResourceServerConfiguration extends 
     ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests() 
       .antMatchers("/api/v1/me/**").authenticated(); 
    } 
} 

的問題是,的oauth2配置似乎推翻第一配置和我所有的網頁資源,而不問暴露表單登錄中的用戶名密碼。如果我嘗試訪問我的API端點,我會得到預期的oauth錯誤響應。

我是否需要在一種重寫方法中使用它們?我需要有2個HttpSecurity實例嗎?我該如何解決這個問題?

回答

1

我曾遇到過同樣的情況。最後得到了一個解決方案。您只需要使用@Order註釋。

添加到您的WebSecurityConfig類

@Order(1) 

並添加到您的ResourceServerConfiguration類

@Order(2) 
+0

爲什麼我用春天開機'/ API/V1/ME/**'可以通過訪問每個身體? –

0

爲了保護您的所有資源,您必須添加 .authorizeRequests().anyRequest().authenticated()。你的意思是你的「/ account/**」資源是否暴露?

這兩個HttpSecurity對象不是同一個對象。這就是說你不需要同時配置它們,但它們中的每一個都有不同的用途。 (我有他們在我的項目中配置,它的工作正常)

我會開始審查您對此的期望,因爲我不確定是否可以讓您的服務器的一部分受OAuth保護,另一部分通過另一種身份驗證機制(表單登錄)。兩者都將被視爲.authenticated()。您可以通過角色和oauth範圍來管理訪問,但是您還必須通過不同的過濾器提供登錄/註銷機制,並且可能需要另一個過濾器來在通過服務器導航時提供持久的身份驗證。對我來說,就像很多不那麼標準的工作,我會考慮不同的解決方案。

相關問題