本文由 發(fā)布,轉(zhuǎn)載請注明出處,如有問題請聯(lián)系我們! 發(fā)布時間: 2021-05-17Keycloak 13 自定義用戶身份認證流程(User Storage SPI)
加載中Keycloak 13 自定客戶身份驗證步驟(User Storage SPI)
Keycloak
版本號:13.0.0
spring-boot 新項目 GitHub
user-storage-spi 新項目 Github
詳細介紹
Keycloak 是為當代應(yīng)用軟件和服務(wù)項目給予的一個開源系統(tǒng)的真實身份和瀏覽管理方法的解決方法。
Keycloak 在接口測試能夠 應(yīng)用嵌入數(shù)據(jù)庫查詢,工作環(huán)境必須重新部署數(shù)據(jù)庫查詢。下列將一一詳細介紹怎么使用嵌入數(shù)據(jù)庫查詢、重新部署數(shù)據(jù)庫查詢。
尤其必須留意 Keycloak 是在 WildFly 上搭建的。
文件目錄- Keycloak
- 詳細介紹
- 安裝
- 系統(tǒng)要求
- 文件目錄構(gòu)造
- 應(yīng)用 Docker 安裝 Keycloak
- 應(yīng)用
- 建立 realm 和 客戶
- 建立 realm
- 建立客戶
- 新創(chuàng)建賬號登錄控制面板
- 建立 realm 和 客戶
- Spring-Boot 驗證
- 申請注冊手機客戶端到 Keycloak 中
- 驗證
- Bearer 動態(tài)口令
- 復位瀏覽動態(tài)口令
- 申請注冊瀏覽動態(tài)口令
- Keycloak Representations
- Keycloak 電源適配器配備
- OIDC 動態(tài)性手機客戶端申請注冊
- 手機客戶端申請注冊對策
- 驗證
- 管理方法手機客戶端
- OIDC 手機客戶端
- 建立 OIDC 手機客戶端
- OIDC 手機客戶端
- 申請注冊手機客戶端到 Keycloak 中
- 應(yīng)用外界數(shù)據(jù)庫查詢
- 客戶儲存 SPI
- 裝包和布署
- 自定客戶儲存 Provider
- Spring-boot 應(yīng)用外界用戶認證
- 客戶儲存 SPI
- Keycloak 人物角色
- 應(yīng)用數(shù)據(jù)庫查詢賬號登錄
安裝
系統(tǒng)要求
- Java8 JDK
- 最少 512M 運行內(nèi)存
- 最少 1G 硬盤
- 假如要設(shè)定 Keycloak 群集則必須數(shù)據(jù)庫查詢,例如:PostgreSQL、Oracle、MySQL 等
- 假如要運作群集,必須互聯(lián)網(wǎng)適用廣播節(jié)目。自然還可以不用,只不過是必須變更一堆配備
文件目錄構(gòu)造
- bin/ —— 各種各樣運行服務(wù)項目、網(wǎng)絡(luò)服務(wù)器上實行管理方法的腳本制作
- domain/ —— 群集方式下的環(huán)境變量和工作中文件目錄
- modules/ —— 服務(wù)項目應(yīng)用的 Java 包
- standalone/ —— 單機版方式下的環(huán)境變量和工作中文件目錄
- standalone/deployments/ —— 你自定的拓展文檔
- themes/ —— 頁面主題風格文檔
應(yīng)用 Docker 安裝 Keycloak
-
運行器皿
docker run -p 10010:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:13.0.0
-
取得成功運行后瀏覽:
http://127.0.0.1:10010/
-
登陸 Keycloak 服務(wù)項目
a. 點一下 Administration Console
b. 鍵入賬戶:admin,登陸密碼:admin
c. 進到控制面板頁面
應(yīng)用
建立 realm 和 客戶
建立一個 realm 和客戶以瀏覽內(nèi)嵌的賬號管理控制面板。把 realm 想像成租賃戶的定義。
Master realm
—— 這一 realm 是復位時建立的,它包括超級用戶。應(yīng)用這一 realm 管理方法其他的 realm。Other realm
—— 超級用戶建立的 realm 。在這種 realm 里,超級用戶建立客戶和應(yīng)用軟件,客戶有著應(yīng)用軟件。
建立 realm
-
點一下
Add realm
按鍵
-
鍵入 realm 名字
-
點一下
create
按鍵進行建立
點一下建立進行 demo realm 建立。
建立客戶
-
轉(zhuǎn)換 realm 到 Demo
-
建立客戶,Users -> Add User,鍵入
Username
,點一下Save
按鍵
-
密碼設(shè)置
新創(chuàng)建賬號登錄控制面板
- 撤出 admin 賬號登錄
- 詳細地址鍵入:
http://127.0.0.1:10010/auth/realms/demo/account/
,點一下Sign In
按鍵,應(yīng)用新創(chuàng)建的客戶 Zhang 登陸
- 設(shè)置新密碼
- 登錄成功
Spring-Boot 驗證
申請注冊手機客戶端到 Keycloak 中
應(yīng)用軟件或服務(wù)項目為了更好地能應(yīng)用 Keycloak,務(wù)必在 Keycloak 中申請注冊一個手機客戶端。能夠 根據(jù)超級用戶頁面申請注冊,手機客戶端還可以自身根據(jù) Keycloak 服務(wù)項目申請注冊。
手機客戶端申請注冊服務(wù)項目給予內(nèi)嵌適用:Keycloak Client Representations、OIDC 手機客戶端數(shù)據(jù)庫、SAML 實體線敘述。手機客戶端申請注冊服務(wù)項目詳細地址是:/auth/realms/<realm>/clients-registrations/<provider>
內(nèi)嵌的 provider
是
- default —— Keycloak Client Representation(JSON)
- install —— Keycloak Adapter Configuration(JSON)
- openid-connect —— OIDC 手機客戶端數(shù)據(jù)庫敘述(JSON)
- saml2-entity-descriptor —— SAML 實體線敘述者(XML)
驗證
啟用手機客戶端申請注冊服務(wù)項目必須動態(tài)口令。動態(tài)口令能夠 是 bearer 動態(tài)口令,復位瀏覽動態(tài)口令或是申請注冊動態(tài)口令。不用動態(tài)口令申請注冊手機客戶端還可以,可是必須配備手機客戶端申請注冊對策。
Bearer 動態(tài)口令
Bearer 動態(tài)口令能夠 意味著客戶或是服務(wù)項目帳戶。啟用節(jié)點必須下列管理權(quán)限:
- create-client 或是 manage-client —— 建立手機客戶端
- view-client 或是 manage-client —— 查詢手機客戶端
- manage-client —— 升級或是刪掉手機客戶端
假如應(yīng)用 Bearer 動態(tài)口令建立手機客戶端,強烈推薦應(yīng)用來源于服務(wù)項目帳戶(create-client
人物角色)的動態(tài)口令。
復位瀏覽動態(tài)口令
強烈推薦應(yīng)用復位瀏覽動態(tài)口令申請注冊手機客戶端。復位瀏覽動態(tài)口令只有用以建立手機客戶端,而且能夠 配備有效期限,另外能夠 配備能夠 建立是多少手機客戶端。
復位瀏覽動態(tài)口令能夠 根據(jù)超級用戶控制面板建立。
點一下儲存,進行動態(tài)口令的建立。
當點一下儲存之后會轉(zhuǎn)化成動態(tài)口令,這一動態(tài)口令假如忘掉拷貝了,那麼就只有再次建立了。應(yīng)用 bearer 動態(tài)口令:
Authorization: bearer eyJhbGciOiJSUz...
申請注冊瀏覽動態(tài)口令
當根據(jù)手機客戶端申請注冊服務(wù)項目建立手機客戶端時,傳參會包括一個申請注冊瀏覽動態(tài)口令。申請注冊瀏覽動態(tài)口令給予查找手機客戶端配備、升級或是刪掉手機客戶端的管理權(quán)限。申請注冊瀏覽動態(tài)口令應(yīng)用方法和 bear 動態(tài)口令、復位瀏覽動態(tài)口令的應(yīng)用方法是一樣的。申請注冊瀏覽動態(tài)口令是一次性的,當它應(yīng)用時,傳參里總是會包括一個新的動態(tài)口令。
假如手機客戶端在手機客戶端申請注冊服務(wù)項目以外建立,申請注冊瀏覽動態(tài)口令就不容易和手機客戶端關(guān)系起來了。但能夠 在超級用戶控制面板轉(zhuǎn)化成申請注冊瀏覽動態(tài)口令。
Keycloak Representations
default
手機客戶端申請注冊服務(wù)提供商能夠 建立、查找、升級、刪掉手機客戶端。應(yīng)用 Keycloak Client Representation 變換給予配備手機客戶端適用,如同在超級用戶控制面板配備的一樣。
建立 Client Representation(JSON)實行 HTTP POST 要求 /auth/realms/<realm>/clients-registrations/default
。
查找 Client Representation 實行 GET 要求/auth/realms/<realm>/clients-registrations/default/<client id>
。
它也會回到新的申請注冊瀏覽動態(tài)口令。
要升級 Client Representation 實行 HTTP PUT 要求 /auth/realms/<realm>/clients-registrations/default/<client id>
。
它也會回到一個新的申請注冊瀏覽動態(tài)口令。
要刪掉 Client Representation 實行 HTTP DELETE 要求 /auth/realms/<realm>/clients-registrations/default/<client id>
。
Keycloak 電源適配器配備
installation
手機客戶端申請注冊服務(wù)提供商能夠 用以為手機客戶端獲得電源適配器配備。除開動態(tài)口令身份認證以外,還能夠應(yīng)用 HTTP basic 驗證(根據(jù)手機客戶端憑據(jù))。應(yīng)用以下請求頭以進行 HTTP basic 驗證:
Authorization: basic BASE64(client-id ':' client-secret)
要獲得電源適配器配備實行 HTTP GET 要求:/auth/realms/<realm>/clients-registrations/install/<client id>
。
公共性手機客戶端不用身份驗證。這代表著 JavaScript 電源適配器能夠 根據(jù)之上 URL 立即從 Keycloak 載入手機客戶端配備。
OIDC 動態(tài)性手機客戶端申請注冊
終端設(shè)備在 Keycloak 中申請注冊手機客戶端 /auth/realms/<realm>/clients-registrations/openid-connect[/<client id>]
。
在 OIDC 發(fā)覺中能夠 為 realm 尋找終端設(shè)備,/auth/realms/<realm>/.well-known/openid-configuration
。
手機客戶端申請注冊對策
Keycloak 當今適用二種方法申請注冊手機客戶端(根據(jù)手機客戶端申請注冊服務(wù)項目)。
- 驗證要求 —— 申請注冊手機客戶端要求要不包括復位瀏覽動態(tài)口令,要不包括 Bearer 動態(tài)口令
- 密名要求 —— 申請注冊手機客戶端不用包括一切動態(tài)口令
密名手機客戶端申請注冊要求是十分有意思和強勁的作用,所有人都能夠申請注冊手機客戶端而且沒有限定。因而明確提出了手機客戶端申請注冊對策 SPI,它給予了一個限定的方法(誰可以申請注冊,在什么標準下)。
在 Keycloak 超級用戶控制面板中,你能見到密名要求對策配備和驗證要求對策配備。
當今適用的對策:
- Trusted Hosts Policy —— 能夠 配備信賴的 host 和網(wǎng)站域名。默認設(shè)置的,沒有授權(quán)管理 host,因此 密名手機客戶端申請注冊事實上是禁止使用的。
- Consent Required Policy —— 剛注冊的的手機客戶端
Consent Allowed
電源開關(guān)是運行的。因此 身份驗證取得成功后,客戶將見到準予對話(假如需要的話)。 - Protocol Mapper Policy —— 容許配備協(xié)議映射完成授權(quán)管理。
- Client Scope Policy —— 容許
Client Scopes
授權(quán)管理,用以剛注冊的的手機客戶端或是升級的手機客戶端。 - Full Scope Policy —— 剛注冊的的手機客戶端
Full Scope Allowed
電源開關(guān)是關(guān)掉的。寓意這這種手機客戶端沒有一切 realm 人物角色或是手機客戶端人物角色。 - Max Clients Policy —— 假如申請注冊的手機客戶端總數(shù)在 realm 中大于或等于預設(shè)值將被駁回申訴。初始值 200。
- Client Disabled Policy —— 剛注冊的手機客戶端是禁止使用的。代表著超級用戶必須手動式根據(jù)和開啟剛注冊的的手機客戶端。這一對策默認設(shè)置不開啟。
管理方法手機客戶端
手機客戶端是客戶要求身份驗證的實體線。手機客戶端有二種文件格式。第一種是單點登陸的(SSO)。另一種是種類是獲得瀏覽動態(tài)口令隨后意味著客戶瀏覽服務(wù)項目。
OIDC 手機客戶端
建立 OIDC 手機客戶端
-
手機客戶端目錄
-
加上手機客戶端,
Client ID
是手機客戶端的真實身份標志。下一步挑選手機客戶端協(xié)議書openid-connect
。
Client ID
數(shù)據(jù)信息英文字母字符串數(shù)組,用以手機客戶端身份核查(當 OIDC 要求時)。Name
手機客戶端名字。Description
手機客戶端敘述。Enabled
假如關(guān)掉,手機客戶端將不允許要求認證。Consent Required
假如開啟,客戶將獲得一個準予網(wǎng)頁頁面(用以了解客戶是不是受權(quán)應(yīng)用軟件瀏覽)。網(wǎng)頁頁面另外表明手機客戶端要瀏覽的元數(shù)據(jù)信息,客戶能夠 見到手機客戶端要瀏覽的信息內(nèi)容。Access Type
OIDC 手機客戶端種類。- confidential:商業(yè)秘密瀏覽種類用以服務(wù)器端手機客戶端(必須實行瀏覽器登錄和必須手機客戶端登陸密碼)。這一種類用以服務(wù)器端應(yīng)用軟件。
- public:Public 瀏覽種類是手機客戶端種類手機客戶端(必須實行瀏覽器登錄)。手機客戶端種類應(yīng)用軟件沒有安全性儲存密秘的方法。反過來,根據(jù)為手機客戶端配備恰當?shù)奶D(zhuǎn) URI 來限定瀏覽十分關(guān)鍵。
- bearer-only:Bearer-only 瀏覽種類代表著應(yīng)用軟件僅容許 bearer 動態(tài)口令要求。假如開啟這一,應(yīng)用軟件不可以參加瀏覽器登錄。
Standard Flow Enabled
假如開啟這一,手機客戶端將應(yīng)用 OIDC 授權(quán)碼工作流引擎。Implicit Flow Enabled
假如開啟這一,手機客戶端將應(yīng)用 OIDC 隱式工作流引擎。Direct Access Grants Enabled
假如開啟這一,手機客戶端將應(yīng)用 OIDC 立即瀏覽受權(quán)。OAuth 2.0 Device Authorization Grant Enabled
假如開啟這一,手機客戶端將應(yīng)用 OIDC 機器設(shè)備受權(quán)批準。OpenID Connect Client Initiated Backchannel Authentication Grant Enabled
假如開啟這一,手機客戶端將應(yīng)用 OIDC 手機客戶端復位后端開發(fā)方式驗證批準。Root URL
假如 Keycloak 不應(yīng)用一切相對性 URL,這一值便是預埋值。Valid Redirect URIs
這個是選填字段名。鍵入 URL 免費模板隨后點一下 號加上。點一下 - 號清除 URL。記牢,最終也要點一下Sava
按鍵。使用通配符 * 只有用以 URI 的尾端,比如:http://host.com/*
申請注冊跳轉(zhuǎn) URL 免費模板時,你應(yīng)該考慮到防止黑客攻擊。
Base URL
假如 Keycloak 要連接手機客戶端,這一值必須設(shè)定。Admin URL
為 Keycloak 特定手機客戶端電源適配器,這一值是手機客戶端回調(diào)函數(shù)終端設(shè)備。Keycloak 服務(wù)項目將應(yīng)用這一 URI 回調(diào)函數(shù)(例如:消息推送撤銷對策、實行后端開發(fā)方式退出登錄、其他超級用戶實際操作)。針對 Keycloak servlet 電源適配器而言,這一值是 servlet 應(yīng)用軟件的 root URL。Web Origins
這一設(shè)定是以 CORS 為管理中心。 -
保密工作客戶端證書
假如手機客戶端access type
設(shè)定為confidential
時,網(wǎng)頁頁面可能表明Credentials
標識。留意,挑選Confidential
標識要儲存之后才會能見到Credentials
標識。
Client Authenticator
下拉列表指定你的數(shù)據(jù)加密客戶端證書種類。默認設(shè)置是Client Id and Secret
。secret 自動生成,而且Regenerate Secret
按鍵能夠 再次轉(zhuǎn)化成 secret。除此之外,能夠 挑選
Signed Jwt
或是X509 Certificate
認證替代 secret。Signed JWT
當挑選 Signed Jwt 種類時,你需要為手機客戶端轉(zhuǎn)化成公鑰和資格證書。公鑰用以 JWT 簽字,資格證書用以服務(wù)器端認證簽字。點一下
Generate new keys and certificate
按鍵轉(zhuǎn)化成公鑰和資格證書。還可以應(yīng)用其他專用工具轉(zhuǎn)化成,隨后導進。
-
新創(chuàng)建 Spring-boot 新項目
-
建立 Keycloak 手機客戶端,導航欄到
http://127.0.0.1:10010/
,轉(zhuǎn)換到Demo
realm ,點一下Clients
萊單,點一下Create
按鍵,建立一個Demo
realm 下的手機客戶端。手機客戶端 ID 為:spring-boot-toy。挑選Access Type
為confidential
。
-
建立人物角色 toy-admin,并給客戶授予人物角色
-
Spring 新項目加上 Maven 引入
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.10.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.toy.keycloak</groupId> <artifactId>toy-keycloak</artifactId> <version>0.0.1-SNAPSHOT</version> <name>toy-keycloak</name> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.keycloak.bom</groupId> <artifactId>keycloak-adapter-bom</artifactId> <version>13.0.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
-
曝露 Api 插口
package com.toy.keycloak.webapi; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author Zhang_Xiang * @since 2021/5/11 16:56:57 */ @RestController @RequestMapping("temp") public class TempController { @GetMapping("weather") public String weather(){ return "大晴天??"; } }
-
配備
應(yīng)用 Tomcat、Undertow、Jetty 不用附加配備。在
application.properties
中配備 Keycloak 以下:keycloak.realm=demo # realm 名字 keycloak.auth-server-url=http://127.0.0.1:10010/auth # Keycloak 基礎(chǔ)服務(wù)詳細地址 keycloak.ssl-required=external keycloak.resource=spring-boot-toy # 應(yīng)用軟件手機客戶端 ID keycloak.credentials.secret=91437668-b8f8-425b-ba9d-38439115dfbc keycloak.use-resource-role-mappings=true keycloak.securityConstraints[0].authRoles[0]=toy-admin keycloak.security-constraints[0].securityCollections[0].patterns[0]=/*
設(shè)定
keycloak.enabled = false
能夠 停止使用 Keycloak 。 -
運行 Spring 應(yīng)用軟件,并瀏覽
http://localhost:8080/temp/weather
鍵入登錄名
zhang
,登陸密碼123456
-
管理方法登陸客戶對話,賬號登錄后,進到 Keycloak 后臺管理系統(tǒng),轉(zhuǎn)換到 Demo realm 能夠 見到現(xiàn)階段登陸的對話目錄。
點一下
Logout all
按鍵,全部客戶都將退出登錄。
應(yīng)用外界數(shù)據(jù)庫查詢
Keycloak 嵌入了 H2 內(nèi)存數(shù)據(jù)庫。Keycloak 默認設(shè)置應(yīng)用 H2 分布式鎖數(shù)據(jù)信息。H2 數(shù)據(jù)庫查詢不適感用以分布式系統(tǒng)情景而且不適感用以群集。
Keycloak 應(yīng)用雙層技術(shù)性分布式鎖關(guān)系數(shù)據(jù)。最底層技術(shù)性是 JDBC。JDBC 用以聯(lián)接 RDBMS。每一個數(shù)據(jù)庫查詢服務(wù)提供商都是有不一樣的 JDBC 驅(qū)動器。高層技術(shù)性用以分布式鎖的是 Hibernate JPA。
客戶儲存 SPI
應(yīng)用客戶儲存 SPI 拓展 Keycloak 以聯(lián)接外界客戶數(shù)據(jù)信息和資格證書儲存。當 Keycloak 運作時搜索客戶時,例如賬號登錄,Keycloak 實行好多個流程精準定位客戶。最先看客戶是在在客戶緩存文件中,隨后在本地數(shù)據(jù)庫中搜索,假如找不著,循環(huán)系統(tǒng)客戶儲存 SPI 實行搜索。
客戶儲存 SPI 服務(wù)提供商完成裝包和布署和 Java EE 部件類似。默認設(shè)置不開啟部件,假如要開啟必須在 Keycloak 超級用戶控制面板頁面中配備 User Feberation
。
裝包和布署
客戶儲存服務(wù)提供商裝包為 JAR 隨后布署到 Keycloak 運作時或是從 Keycloak 運作時撤銷布署,如同 WildFly 應(yīng)用軟件服務(wù)項目布署服務(wù)項目一樣。你也能夠 立即復制 JAR 包到 standalone/deployments/
網(wǎng)絡(luò)服務(wù)器文件目錄,或是應(yīng)用 JBoss CLI 實行布署。
為了更好地 Keycloak 能鑒別服務(wù)供應(yīng)商,你需要加上一個文檔到 JAR 庫中:META-INF/services/org.keycloak.storage.UserStorageProviderFactory
。這一文檔務(wù)必包括完成 UserStorageProviderFactory
類的全途徑:
org.keycloak.examples.federation.properties.ClasspathPropertiesStorageFactory
org.keycloak.examples.federation.properties.FilePropertiesStorageFactory
自定客戶儲存 Provider
應(yīng)用現(xiàn)有客戶數(shù)據(jù)庫查詢。
MysqlUserStorageProvider 完成了許多插口,完成 UserStorageProvider
是完成是 SPI 的基本上規(guī)定,也就是說,不完成 UserStorageProvider
就不可以完成 SPI,UserLookupProvider
用以完成從外界數(shù)據(jù)庫查詢搜索客戶以完成賬號登錄,UserQueryProvider
界定繁雜查看以搜索客戶,CredentialInputValidator
認證不一樣的資格證書種類(例如:認證賬戶密碼)。
-
provider
public class MysqlUserStorageProvider implements UserLookupProvider, UserQueryProvider, CredentialInputValidator, UserStorageProvider { protected KeycloakSession session; protected ComponentModel model; public MysqlUserStorageProvider(KeycloakSession session, ComponentModel model) { this.session = session; this.model = model; } ... }
-
ProviderFactory
,這兒的ProviderConfigProperty
用以自定義標簽,也就是說,在這兒界定了標識之后,能夠 在 Keycloak 管理方法頁面設(shè)定值,編碼能夠 立即載入到這種值。加上自定 SPI 時,要注意加上在什么 realm 下。public class MysqlUserStorageProviderFactory implements UserStorageProviderFactory<MysqlUserStorageProvider> { protected final List<ProviderConfigProperty> configMetadata; public MysqlUserStorageProviderFactory() { configMetadata = ProviderConfigurationBuilder.create() .property() .name(CONFIG_KEY_JDBC_DRIVER) .label("JDBC Driver Class") .type(ProviderConfigProperty.STRING_TYPE) .defaultValue("org.h2.Driver") .helpText("Fully qualified class name of the JDBC driver") .add() .property() .name(CONFIG_KEY_JDBC_URL) .label("JDBC URL") .type(ProviderConfigProperty.STRING_TYPE) .defaultValue("jdbc:h2:mem:customdb") .helpText("JDBC URL used to connect to the user database") .add() .property() .name(CONFIG_KEY_DB_USERNAME) .label("Database User") .type(ProviderConfigProperty.STRING_TYPE) .helpText("Username used to connect to the database") .add() .property() .name(CONFIG_KEY_DB_PASSWORD) .label("Database Password") .type(ProviderConfigProperty.STRING_TYPE) .helpText("Password used to connect to the database") .secret(true) .add() .property() .name(CONFIG_KEY_VALIDATION_QUERY) .label("SQL Validation Query") .type(ProviderConfigProperty.STRING_TYPE) .helpText("SQL query used to validate a connection") .defaultValue("select 1") .add() .build(); } @Override public MysqlUserStorageProvider create(KeycloakSession session, ComponentModel model) { return new MysqlUserStorageProvider(session, model); } @Override public String getId() { return "user-center-provider"; } @Override public List<ProviderConfigProperty> getConfigProperties() { return configMetadata; } @Override public void validateConfiguration(KeycloakSession session, RealmModel realm, ComponentModel config) throws ComponentValidationException { try (Connection c = DbUtil.getConnection(config)) { System.out.println(config.get(CONFIG_KEY_VALIDATION_QUERY)); c.createStatement().execute(config.get(CONFIG_KEY_VALIDATION_QUERY)); } catch (Exception ex) { System.out.println(ex.getMessage()); throw new ComponentValidationException("Unable to validate database connection", ex); } } }
-
查詢客戶目錄
Spring-boot 應(yīng)用外界用戶認證
-
application.properties
keycloak.realm=demo keycloak.auth-server-url=http://127.0.0.1:10010/auth keycloak.ssl-required=external keycloak.resource=spring-boot-toy keycloak.credentials.secret=91437668-b8f8-425b-ba9d-38439115dfbc keycloak.use-resource-role-mappings=true keycloak.verify-token-audience=true keycloak.securityConstraints[0].authRoles[0]=user keycloak.security-constraints[0].securityCollections[0].patterns[0]=/temp/weather
- resource:手機客戶端 ID
- use-resource-role-mappings:當設(shè)定為 true 時,OIDC Java 電源適配器將 Token 中搜索應(yīng)用軟件財號人物角色投射。設(shè)定為 false 時,將從 realm 里搜索客戶人物角色投射。默認為 false。
- ssl-required:保證全部和 Keycloak 通信的要求是 HTTPS,工作環(huán)境應(yīng)設(shè)定為
all
,初始值是external
,即外界要求必須 HTTPS,可選值是:all
、external
、none
。 - verify-token-audience:設(shè)定為 true 時,Bearer Token 開展身份驗證時,電源適配器會認證動態(tài)口令是不是包括手機客戶端名字。開啟將改進安全系數(shù)(強烈推薦)。
Keycloak 人物角色
一個 Realm 有好幾個手機客戶端,一個手機客戶端有好幾個客戶。在 Keycloak 有3種人物角色:
- Realm Role:全局性人物角色,歸屬于特定 realm。一切手機客戶端都能夠瀏覽這一人物角色,而且把這個人物角色投射到一切客戶。
- Client Role:歸屬于特定手機客戶端的人物角色。只有投射到該手機客戶端下的客戶。
- Composite Role:好幾個人物角色的組成。
在手機客戶端設(shè)定中開啟 Service Accounts Enabled
,在 demo Realm 中加上 ordinary_user
人物角色。
在 Service Account Roles
標識中加上 ordinary_user
人物角色。
加上該人物角色之后,轉(zhuǎn)換到 User
標識,能夠 見到客戶中早已關(guān)系了人物角色。
應(yīng)用數(shù)據(jù)庫查詢賬號登錄
-
加上人物角色限定
ordinary_user
keycloak.realm=demo keycloak.auth-server-url=http://127.0.0.1:10010/auth keycloak.ssl-required=external keycloak.resource=spring-boot-toy keycloak.credentials.secret=91437668-b8f8-425b-ba9d-38439115dfbc keycloak.use-resource-role-mappings=true keycloak.verify-token-audience=true keycloak.securityConstraints[0].authRoles[0]=toy-admin keycloak.security-constraints[0].auth-roles[1]=ordinary_user keycloak.security-constraints[0].securityCollections[0].patterns[0]=/temp/weather
-
運行服務(wù)項目,瀏覽 localhost:8080/temp/weather,鍵入自定數(shù)據(jù)庫查詢中的客戶、登陸密碼,以瀏覽插口。