我使用Spring將Oauth2作爲兩個應用程序(提供程序應用程序和消費者應用程序)的後端來創建應用程序。我有兩種不同類型的用戶;提供者和消費者,每個人都有自己的數據庫表。 我面臨的問題是,我無法找到一種方法來知道請求是來自提供者還是客戶,因爲每個請求都將位於不同的數據庫表中。有多個用戶表的Spring Oauth
用戶名在兩個表之間不唯一。所以,提供者和消費者可以擁有相同的用戶名(和密碼)。 我認爲以下任何解決方案都可以,但是,我找不到任何方法來實現它們中的任何一個。
- 對每個用戶類有兩個不同的端點。例如「/ provider/oauth/token」和「/ consumer/oauth/token」。每一個都有它的自定義認證管
- 或者:在同一個Spring應用程序中擁有兩個授權服務器,然後將其「/ oauth/token」映射到不同的端點。
- 或者:在oauth請求中發送自定義數據以知道請求來自哪裏,然後動態選擇一個認證管理器。
- 或者:將不同的身份驗證管理器關聯到不同的OAuth客戶端,然後確保每個應用都具有其各自的客戶端ID。
如果這些解決方案中的任何一種都是可能的,或者如果有其他方法可以實現這一點,請告訴我。 任何幫助表示讚賞。
編輯 - 解決方案
按照下面的答案,我又增加了客戶端與不同的客戶端ID,檢查ID中的UserDetailsService,然後決定使用哪個數據庫。下面是代碼:
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和祕密保護的使用。
謝謝。 你的建議(經過少許修改)爲我工作。我在原始問題中發佈了代碼。 –