[英]Retrieve Keycloak user data using received access token
我正在開發一個WildFly-Backend(用Java),該HTTP接受(來自自定義前端的)HTTP請求,該請求是通過“授權” HTTP標頭用用戶的Keycloak承載訪問令牌簽名的。
后端連接本身已經通過WildFly的Keycloak適配器進行了保護,但是在內部,我想檢查用戶是誰(用戶組,名稱等)並返回非常大的響應。
我認為可以只從Frontend發送此數據,但是一旦有了訪問令牌,人們就可以輕松偽造該請求。 有沒有辦法只擁有訪問令牌就可以檢索用戶數據之類的東西?
從那以后我就想出了解決問題的方法!
首先,在類頂部附近添加以下內容:
@Context
SecurityContext securityContext;
這將注入服務器安全性的上下文。 要使它與Keycloak一起使用,WildFly將需要安裝Wildfly適配器,並且必須將web.xml配置為使用Keycloak。
在繼續之前,我們需要Keycloak-Core庫,例如每個Maven:
<!-- https://mvnrepository.com/artifact/org.keycloak/keycloak-core -->
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>4.4.0.Final</version>
</dependency>
4.4.0.Final
是撰寫此答案時的最新版本; 建議使用最新版本或與Keycloak服務器匹配的版本。
接下來,在要檢索用戶信息的位置,檢索UserPrincipal:
if (securityContext != null && securityContext.getUserPrincipal() instanceof KeycloakPrincipal) {
KeycloakPrincipal principal = ((KeycloakPrincipal) securityContext.getUserPrincipal());
其他檢查是failureaves,因此可以單獨處理非Keycloak配置。
從強制轉換的KeycloakPrinciple中,檢索KeycloakSecurityContext,然后從中獲取用戶的令牌:
AccessToken token = principal.getKeycloakSecurityContext().getToken();
在某些情況下(取決於Keycloak和/或WildFly的版本),getToken()可能返回null。 在這些情況下,請使用getIdToken():
IDToken token = principal.getKeycloakSecurityContext().getIdToken();
AccessToken擴展了IDToken,因此在這兩種情況下,您都具有完整的功能(針對此上下文)。
從令牌中,可以提取所有用戶數據。 例如,我們獲取用戶的用戶名。 在Keycloak中,此屬性稱為“首選用戶名”。
String user = token.getPreferredUsername();
大功告成! 您的完整代碼現在如下所示:
if (securityContext != null && securityContext.getUserPrincipal() instanceof KeycloakPrincipal) {
KeycloakPrincipal principal = ((KeycloakPrincipal) securityContext.getUserPrincipal());
AccessToken token = principal.getKeycloakSecurityContext().getToken();
// IDToken token = principal.getKeycloakSecurityContext().getIdToken();
System.out.println("User logged in: " + token.getPreferredUsername());
} else {
System.out.println("SecurityContext could not provide a Keycloak context.");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.