簡體   English   中英

使用收到的訪問令牌檢索Keycloak用戶數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM