2017-04-05 21 views
0

我使用Spring將Oauth2作爲兩個應用程序(提供程序應用程序和消費者應用程序)的後端來創建應用程序。我有兩種不同類型的用戶;提供者和消費者,每個人都有自己的數據庫表。 我面臨的問題是,我無法找到一種方法來知道請求是來自提供者還是客戶,因爲每個請求都將位於不同的數據庫表中。有多個用戶表的Spring Oauth

用戶名在兩個表之間不唯一。所以,提供者和消費者可以擁有相同的用戶名(和密碼)。 我認爲以下任何解決方案都可以,但是,我找不到任何方法來實現它們中的任何一個。

  • 對每個用戶類有兩個不同的端點。例如「/ provider/oauth/token」和「/ consumer/oauth/token」。每一個都有它的自定義認證管
  • 或者:在同一個Spring應用程序中擁有兩個授權服務器,然後將其「/ oauth/token」映射到不同的端點。
  • 或者:在oauth請求中發送自定義數據以知道請求來自哪裏,然後動態選擇一個認證管理器。
  • 或者:將不同的身份驗證管理器關聯到不同的OAuth客戶端,然後確保每個應用都具有其各自的客戶端ID。

如果這些解決方案中的任何一種都是可能的,或者如果有其他方法可以實現這一點,請告訴我。 任何幫助表示讚賞。

編輯 - 解決方案

按照下面的答案,我又增加了客戶端與不同的客戶端ID,檢查ID中的UserDetailsS​​ervice,然後決定使用哪個數據庫。下面是代碼:

public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { 
      UsernamePasswordAuthenticationToken authentication = (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); 
      User user = (User) authentication.getPrincipal(); 
      String username = user.getUsername(); 
      if (username.equals(OAuth2Configuration.provider_app)) 
        // Load from provider db 
      else if (username.equals(OAuth2Configuration.consumer_app)) 
        // Load from consumer db 
      else 
       throw new UsernameNotFoundException("ClientID " + username + " not found."); 
     } 
    }; 
} 

UsernamePasswordAuthenticationToken爲/的OAuth /令牌與使用基本的Oauth客戶端ID和祕密保護的使用。

回答

1

我想你應該可以往裏SecurityContextHolder.getContext().getAuthentication。 這應該是OAuth2Authentication一個實例,從中可以(你施放後)調用getOAuth2Request()來獲得原始Oauth2Request細節。

有了這些信息,你可以有一個UserDetailsService可以委託查找到正確的數據庫表。你可以使用scopes或resourceIds來幫助確定使用哪個數據庫表。

+0

謝謝。 你的建議(經過少許修改)爲我工作。我在原始問題中發佈了代碼。 –