2015-10-22 124 views
2

我有一個查詢我正在努力得到一個體面的答案,並希望通過發聲有人可能能夠引導我或在正確的方向提醒我。Web應用程序的彈簧Oauth

我們所有當前的Web應用程序都是使用Spring構建的,其中包括當然由Spring Security模塊處理的安全性。 我們正在探索將我們的一些新的android項目集成到這些web應用程序中的機會。

經過一番研究和指導,所有標誌都指向Android App中的OAuth2實現,並使用它通過Restfull調用獲取對Web應用程序服務器的相關部分的訪問權限。

我現在想明白的是,我們是否應該在我們的Web應用程序中替換現有的Spring Security實現,並將其替換爲Spring Oauth2等價物。

總體目標是能夠有一個單一的安全解決方案,我們將用於網站登錄,應用程序登錄以及任何可能暴露給其他Web應用程序的API實現。

如果任何人都可以提供一個鏈接到Spring Oauth2 Java配置(非XML)設置,用戶登錄並以不穩定的方式根據角色訪問頁面,這也是非常有用的。我們發現的大多數例子都非常複雜,僅僅關注restfull調用,或者只關注XML配置。

回答

0

似乎你沒有聽說過有關簡化與oauth2提供商合作的spring-cloud-security項目。看一看:

http://cloud.spring.io/spring-cloud-security/

有在github上(如上頁的右側)提供樣品。它顯示瞭如何設置以防止只使用一個oauth2提供程序 - 檢查顯示如何爲github執行此操作的項目https://github.com/spring-cloud-samples/sso。你通過配置application.yml文件+添加@EnableOAuth2Sso註釋來完成大部分這些工作,以便所有機器啓動。

對於與您的Web應用程序進行「正常」交互,它非常直觀。如果你需要你的應用程序作爲其他人的api工作,那麼你必須保留令牌,將它們添加到請求中。如果你的api客戶端也是你可以更改的代碼,那麼你可以使用OAuth2RestTemplate類,所以你可以對你的API進行查詢,因爲它是通常的/不安全的端點。

如果需要使用例如兩個不同的供應商爲不同的路徑,然後它更復雜,你必須配置它們都喜歡:

@Bean 
public OAuth2RestTemplate facebookOAuth2RestTemplate(OAuth2ClientContext clientContext) { 
    return new OAuth2RestTemplate(facebookOAuth2ResourceDetails(), clientContext); 
} 

@Bean 
public OAuth2ProtectedResourceDetails facebookOAuth2ResourceDetails() { 
    AuthorizationCodeResourceDetails resource = new AuthorizationCodeResourceDetails(); 
    resource.setAccessTokenUri(tokenUri); 
    resource.setId("id"); 
    resource.setUserAuthorizationUri(authorizationUri); 
    resource.setUseCurrentUri(false); 
    resource.setPreEstablishedRedirectUri(redirectUri); 
    resource.setClientId(clientId); 
    resource.setClientSecret(clientSecret); 
    resource.setTokenName("tokenname"); 
    resource.setAuthenticationScheme(AuthenticationScheme.query); 
    resource.setClientAuthenticationScheme(AuthenticationScheme.form); 

    return resource; 
} 

,並決定在這種情況下使用哪種OAuth2RestTemplate實例。

//更新

如果您想通過一些的oauth2提供商可以提供授權用戶交換春季安全核心擴展OAuth2SsoConfigurerAdapter類:

@Configuration 
@EnableOAuth2Sso 
public class WebSecurityConfig extends OAuth2SsoConfigurerAdapter { 

@Override 
public void match(RequestMatchers matchers) { 
    matchers.antMatchers("/admin"); 
} 

@Override 
public void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
      .antMatchers("/admin").hasRole("ADMIN") 
      .and() 
      .logout().logoutUrl("/logout").permitAll() 
      .logoutSuccessUrl("/"); 
} 

所以/管理員現在將保護和用戶重定向到您指定的任何授權服務器。它需要application.yml中的oauth配置。

spring: 
    oauth2: 
    client: # Sauron 
     clientId: app_clientid 
     clientSecret: app_secret 
     accessTokenUri: http://authorizationserver/oauth/token 
     userAuthorizationUri: http://authorizationserver/oauth/authorize 
     clientAuthenticationScheme: header 
    resource: 
     tokenInfoUri: http://authorizationserver/oauth/check_token 
     preferTokenInfo: false 

這就是爲什麼我之前寫過它只能使用一個auhorization服務器,但如果您需要更多,那麼它更復雜。

+0

謝謝@freakman,我實際上看到了這一點,但不幸的是我不幸回答了我的查詢。可以使用Oauth2來代替標準的彈簧安全性,而不使用restfull調用,即瀏覽器在非restfull方法下進行的正常調用。或者應該將它作爲一個獨立的實體來實現(僅限於api調用)(請注意,我們不會使用第三方授權者,我們希望創建自己的服務器並將其連接到它的 – Aeseir

+0

它可以用來保護您的控制器爲'正常'彈簧安全 - 這個例子顯示了這個:https://github.com/spring-cloud-samples/sso。更新內容。 – freakman

相關問題