日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Keycloak簡(jiǎn)單幾步實(shí)現(xiàn)對(duì)Spring Boot應(yīng)用的權(quán)限控制

我們?cè)谏弦黄醪絿L試了keycloak,手動(dòng)建立了一個(gè)名為felord.cn的realm并在該realm下建了一個(gè)名為felord的用戶(hù)。今天就來(lái)嘗試一下對(duì)應(yīng)的Spring Boot Adapter,來(lái)看看keycloak是如何保護(hù)Spring Boot應(yīng)用的。

關(guān)注并星標(biāo) 碼農(nóng)小胖哥,第一時(shí)間獲取相關(guān)干貨文章。

客戶(hù)端

相信不少同學(xué)用過(guò)微信開(kāi)放平臺(tái)、螞蟻開(kāi)放平臺(tái)。首先我們需要在這些開(kāi)放平臺(tái)上注冊(cè)一個(gè)客戶(hù)端以獲取一套類(lèi)似用戶(hù)名和密碼的憑證。有的叫appid和secret;有的叫clientid和secret,都是一個(gè)意思。其實(shí)keycloak也差不多,也需要在對(duì)應(yīng)的realm中注冊(cè)一個(gè)客戶(hù)端。下圖不僅僅清晰地說(shuō)明了keycloak中Masterrealm和自定義realm的關(guān)系,還說(shuō)明了在一個(gè)realm中用戶(hù)和客戶(hù)端的關(guān)系。

Realm、client、user關(guān)系圖

我們需要在felord.cn這個(gè)realm中建立一個(gè)客戶(hù)端:

在realm中創(chuàng)建客戶(hù)端

創(chuàng)建完畢后你會(huì)發(fā)現(xiàn)felord.cn的客戶(hù)端又多了一個(gè):

realm的客戶(hù)端列表

你可以通過(guò)http://localhost:8011/auth/realms/felord.cn/account/來(lái)登錄創(chuàng)建的用戶(hù)。

然后我們對(duì)客戶(hù)端spring-boot-client進(jìn)行編輯配置:

填寫(xiě)重定向URL

為了測(cè)試,這里我只填寫(xiě)了設(shè)置選項(xiàng)卡中唯一的必填項(xiàng)有效的重定向URI,這個(gè)選項(xiàng)的意思就是客戶(hù)端springboot-client的所有API都會(huì)受到權(quán)限管控。

角色

基于角色的權(quán)限控制是目前主流的權(quán)限控制思想,keycloak也采取了這種方式。我們需要建立一個(gè)角色并授予上一篇文章中建立的用戶(hù)felord。我們來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的角色:

在keycloak中創(chuàng)建角色

keycloak的角色功能非常強(qiáng)大,在后面的系列文章中胖哥會(huì)和大家深入學(xué)習(xí)這個(gè)概念。

角色映射給用戶(hù)

然后我們把上面創(chuàng)建的角色base_user賦予用戶(hù)felord:

給realm中的用戶(hù)賦予角色

到這里用戶(hù)、角色、角色映射都搞定了,就剩下在客戶(hù)端上定義資源了。

獲取和刷新JWT

我們可以通過(guò)下面這個(gè)方式獲取用戶(hù)登錄的JWT對(duì):

 
 
 
 
  1. POST /auth/realms/felord.cn/protocol/openid-connect/token HTTP/1.1 
  2. Host: localhost:8011 
  3. Content-Type: application/x-www-form-urlencoded 
  4.  
  5. client_id=springboot-client&username=felord&password=123456&grant_type=password 

會(huì)得到:

 
 
 
 
  1.     "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiS 省略", 
  2.     "expires_in": 300, 
  3.     "refresh_expires_in": 1800, 
  4.     "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAi 省略", 
  5.     "token_type": "Bearer", 
  6.     "not-before-policy": 0, 
  7.     "session_state": "2fc7e289-c86f-4f6f-b4d3-1183a9518acc", 
  8.     "scope": "profile email" 

刷新Token只需要把refresh_token帶上,把grant_type改為refresh_token就可以刷新Token對(duì)了,下面是請(qǐng)求刷新的報(bào)文:

 
 
 
 
  1. POST /auth/realms/felord.cn/protocol/openid-connect/token HTTP/1.1 
  2. Host: localhost:8011 
  3. Content-Type: application/x-www-form-urlencoded 
  4.  
  5. client_id=springboot-client&grant_type=refresh_token&refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlYWE2MThhMC05Y2UzLTQxZWMtOTZjYy04MGQ5ODVkZjJjMTIifQ.eyJleHAiOjE2MjU3NjI4ODYsImlhdCI6MTYyNTc2MTA4NiwianRpIjoiZjc2MjVmZmEtZWU3YS00MjZmLWIwYmQtOTM3MmZiM2Q4NDA5IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDExL2F1dGgvcmVhbG1zL2ZlbG9yZC5jbiIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAxMS9hdXRoL3JlYWxtcy9mZWxvcmQuY24iLCJzdWIiOiI0YzFmNWRiNS04MjU0LTQ4ZDMtYTRkYS0wY2FhZTMyOTk0OTAiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoic3ByaW5nYm9vdC1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiZDU2NmU0ODMtYzc5MS00OTliLTg2M2ItODczY2YyNjMwYWFmIiwic2NvcGUiOiJwcm9maWxlIGVtYWlsIn0.P4vWwyfGubSt182P-vcyMdKvJfvwKYr1nUlOYBWzQks 

注意:兩個(gè)請(qǐng)求的 content-type都是application/x-www-form-urlencoded。

Spring Boot客戶(hù)端

建一個(gè)很傳統(tǒng)的Spring Boot應(yīng)用,別忘了帶上Spring MVC模塊,然后加入keycloak的starter:

 
 
 
 
  1.  
  2.        org.keycloak 
  3.        keycloak-spring-boot-starter 
  4.        14.0.0 
  5.     

當(dāng)前keycloak版本是14.0.0 。

然后隨便編寫(xiě)一個(gè)Spring MVC接口:

 
 
 
 
  1. /** 
  2.  * @author felord.cn 
  3.  * @since 2021/7/7 17:05 
  4.  */ 
  5. @RestController 
  6. @RequestMapping("/foo") 
  7. public class FooController { 
  8.  
  9.     @GetMapping("/bar") 
  10.     public String bar(){ 
  11.         return "felord.cn"; 
  12.     } 
  13.  

接下來(lái),我們聲明定義只有felord.cnrealm中包含base_user角色的用戶(hù)才能訪問(wèn)/foo/bar接口。那么定義在哪兒呢?我們先在spring boot中的application.yml中靜態(tài)定義,后續(xù)會(huì)實(shí)現(xiàn)動(dòng)態(tài)控制。配置如下:

 
 
 
 
  1. keycloak: 
  2. # 聲明客戶(hù)端所在的realm 
  3.   realm: felord.cn 
  4. # keycloak授權(quán)服務(wù)器的地址 
  5.   auth-server-url: http://localhost:8011/auth 
  6. # 客戶(hù)端名稱(chēng) 
  7.   resource: springboot-client 
  8. # 聲明這是一個(gè)公開(kāi)的客戶(hù)端,否則不能在keycloak外部環(huán)境使用,會(huì)403 
  9.   public-client: true 
  10. # 這里就是配置客戶(hù)端的安全約束,就是那些角色映射那些資源 
  11.   security-constraints: 
  12. # 角色和資源的映射關(guān)系。下面是多對(duì)多的配置方式 ,這里只配置base_user才能訪問(wèn) /foo/bar 
  13.     - auth-roles: 
  14.         - base_user 
  15.       security-collections: 
  16.         - patterns: 
  17.             - '/foo/bar' 

然后啟動(dòng)Spring Boot應(yīng)用并在瀏覽器中調(diào)用http://localhost:8080/foo/bar,你會(huì)發(fā)現(xiàn)瀏覽器會(huì)跳轉(zhuǎn)到下面這個(gè)地址:

 
 
 
 
  1. http://localhost:8011/auth/realms/felord.cn/protocol/openid-connect/auth?response_type=code&client_id=springboot-client&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Ffoo%2Fbar&state=20e0958d-a7a9-422a-881f-cbd8f25d7842&login=true&scope=openid 

OIDC認(rèn)證授權(quán)登錄

走的是基于OIDC(OAuth 2.0的增強(qiáng)版)的認(rèn)證授權(quán)模式。只有你正確填寫(xiě)了用戶(hù)名和密碼才能得到/foo/bar的正確響應(yīng)。

總結(jié)

請(qǐng)注意:這是系列文章,請(qǐng)點(diǎn)擊文章開(kāi)頭的#keycloak查看已有章節(jié)。

我們僅僅進(jìn)行了一些配置就實(shí)現(xiàn)了OIDC認(rèn)證授權(quán),保護(hù)了Spring Boot中的接口,這真是太簡(jiǎn)單了。不過(guò)看了這一篇文章后你會(huì)有不少疑問(wèn),這是因?yàn)槟悴惶私釵IDC協(xié)議。這個(gè)協(xié)議非常重要,大廠都在使用這個(gè)協(xié)議。下一篇會(huì)針對(duì)這個(gè)協(xié)議來(lái)給你補(bǔ)補(bǔ)課。本文的DEMO已經(jīng)上傳到Git,你可以關(guān)注公眾號(hào):碼農(nóng)小胖哥 回復(fù) keycloak3獲取DEMO。多多點(diǎn)贊、再看、轉(zhuǎn)發(fā)、評(píng)論、有飯恰才是胖哥創(chuàng)作分享的動(dòng)力。

本文轉(zhuǎn)載自微信公眾號(hào)「碼農(nóng)小胖哥」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系碼農(nóng)小胖哥公眾號(hào)。


當(dāng)前名稱(chēng):Keycloak簡(jiǎn)單幾步實(shí)現(xiàn)對(duì)Spring Boot應(yīng)用的權(quán)限控制
文章起源:http://m.5511xx.com/article/ccsheep.html