亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Keycloak 用戶存儲 SPI 實現

Keycloak 用戶存儲 SPI 實現

FFIVE 2023-06-04 17:50:22
我正在嘗試實現自定義 keycloack Authenticator SPI 以針對外部數據源進行身份驗證。Spring boot Rest Service 也可以用,我也可以用那個。我要解決的用例是向用戶顯示 keycloak 登錄屏幕。Onsubmission 用戶根據外部數據源進行驗證。從外部數據源中檢索一些屬性,將其映射到 keycloak 的 id 和訪問令牌。還設置了同一用戶同時多次登錄的用戶限制條件。我在想,這可以通過檢索 keycloak 數據源中可用的用戶會話信息來解決。如果我使用外部數據源,keycloak 是否仍然維護會話信息?我遵循了官方指南(https://www.keycloak.org/docs/latest/server_development/index.html#_auth_spi_walkthrough)的第 8.3 節,這與我需要的非常相似?,F在我跳過并按照第 11 節開始(https://www.keycloak.org/docs/latest/server_development/index.html#_user-storage-spi)似乎也更合適。我所做的是從實施自定義身份驗證器開始,SPI 認為這不是正確的方法,現在實施了 UserStorageProvider。/*** * From UserLookupProvider */public UserModel getUserById(String id, RealmModel realm) {    System.out.println("ID: " + id + ":REALM:" + realm);    StorageId storageId = new StorageId(id);    /**     * StorageId.getExternalId() method is invoked to obtain      * the username embeded in the id parameter     */    String username = storageId.getExternalId();    System.out.println("Name:" + username);    return getUserByUsername(username, realm);}/*** * From UserLookupProvider * This method is invoked by the Keycloak login page when a user logs in */按照文檔(https://www.keycloak.org/docs/latest/server_development/index.html#packaging-and-deployment-2)我們的提供者實現的類文件應該放在一個 jar 中。您還必須在 META-INF/services/org.keycloak.storage.UserStorageProviderFactory 文件中聲明提供者工廠類。這里的問題是:我創建的 jar 在“META-INF”文件夾中沒有服務目錄,我需要手動創建并添加它嗎?org.keycloak.examples.federation.properties.FilePropertiesStorageFactory 創建 jar 后,您可以使用常規的 WildFly 方式部署它:將 jar 復制到 deploy/ 目錄或使用 JBoss CLI。使用 Maven 創建 jar 后,將 jar 復制到“keycloak-6.0.1\standalone\deployments”文件夾。但我沒有在“用戶聯合列表”中看到我的提供者
查看完整描述

3 回答

?
MM們

TA貢獻1886條經驗 獲得超2個贊

萬一有人遇到這樣的問題:

由于 META-INF/services 文件夾,UserStorage SPI 未顯示。它在文檔中提供,但不清楚

在 src/main/resources 中,創建文件夾結構 META-INF/services

在 META-INF/services 目錄中創建一個名為 org.keycloak.storage.UserStorageProviderFactory 的文件(整個就是文件名)。它的內容是您的 SPI 的完全限定類名:com.test.UserSpi


查看完整回答
反對 回復 2023-06-04
?
弒天下

TA貢獻1818條經驗 獲得超8個贊

  • 好的,您已闡明您需要一個用戶存儲提供程序 API。偉大的

  • 現在關于你的第二個“問題/挑戰”:

從外部數據源中檢索一些屬性,將其映射到 keycloak 的 id 和訪問令牌。需要檢索用戶唯一 ID 并將其添加為 jwt 中的主題 ID。這是 id,當此令牌傳遞給其他服務時,其余服務可用于檢索 id。

為此,你能做的最好的事情是:

  1. 添加這些用戶的唯一數據作為用戶屬性(在管理控制臺上查看)

  2. 在 Keycloak 上創建一個“客戶端范圍”,使用“用戶屬性”的映射器將您想要(從您的用戶)添加的那些屬性映射到您的 Id-token 和 access-token。您還需要將您的客戶與您剛剛創建的“客戶范圍”聯系起來。

查看完整回答
反對 回復 2023-06-04
?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

我不確定你需要什么。讓我們從區分 Authentication SPI(聯合身份檢查)和 User Provider SPI(聯合用戶)開始。第一個(文檔的第 8 節 - 更多地關注針對外部服務對用戶進行身份驗證 - 類似于 facebook 或 google)。聯合用戶存儲更像是您在具有遺留“角色結構”的遺留系統中擁有自己的用戶,并且您基本上想通過 keycloak 管理它們(通過導入它們,或者通過某些 API 查詢 - 這將是部分該文檔的 11)。因此,請確定您確實需要什么。


第二,你提到以下內容:


>  User is presented keycloak login screen. Onsubmission User is

> validated against external Datasource.

> Retrieve some attributes from external datasource, map it to

> keycloak's id and access token.

> Also put in a condition of user restriction of same user logging in

> multiple times at the same time.

> I was thinking, it could be solved by retrieving user session

> information that's available in the keycloak datasource. If i use

> external datasource, does keycloak still maintain session information?

你的意思是:從外部數據源中檢索一些屬性,將其映射到 keycloak 的 id 和訪問令牌。?通常您只檢索用戶核心信息,可能還有角色和其他自定義屬性(不是會話信息)。Keycloak 本身作為基于 openIDConnect 的授權服務器,將生成訪問令牌,其中已經包含有關哪些受保護資源可以被誰訪問的信息,因此您實際上不需要從其他地方導入任何會話,也不必擔心上述令牌的生成.


關于: 還設置了同一用戶同時多次登錄的用戶限制條件。當您第一次登錄時,您到底想完成(或避免什么?)您的客戶收到一個有效時間為 X 的 Bearer 令牌,在那段時間內您不需要再次登錄,直到令牌過期或被刪除;再次是您的 Auth 服務器負責的事情,而不是您實現的事情。您想要更具體的東西嗎?


我在想,這可以通過檢索 keycloak 數據源中可用的用戶會話信息來解決。如果我使用外部數據源,keycloak 是否仍然維護會話信息?這聽起來不對,你指的是什么會話數據?或者你需要訪問?您的用戶數據、范圍、角色等可以通過 KEycloak Rest API ( https://www.keycloak.org/docs-api/6.0/rest-api/index.html#_overview )訪問。您的外部數據源用于與用戶相關的核心數據(不是外部會話),您為什么認為需要導入外部會話?


查看完整回答
反對 回復 2023-06-04
  • 3 回答
  • 0 關注
  • 364 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號