<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Keycloak簡單幾步實(shí)現(xiàn)對Spring Boot應(yīng)用的權(quán)限控制

          共 5442字,需瀏覽 11分鐘

           ·

          2021-07-18 13:07

          我們在上一篇初步嘗試了keycloak,手動建立了一個(gè)名為felord.cnrealm并在該realm下建了一個(gè)名為felord的用戶。今天就來嘗試一下對應(yīng)的Spring Boot Adapter,來看看keycloak是如何保護(hù)Spring Boot應(yīng)用的。

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

          客戶端

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

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

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

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

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

          realm的客戶端列表

          ?

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

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

          填寫重定向URL

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

          角色

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

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

          ?

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

          角色映射給用戶

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

          給realm中的用戶賦予角色

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

          獲取和刷新JWT

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

          POST /auth/realms/felord.cn/protocol/openid-connect/token HTTP/1.1
          Host: localhost:8011
          Content-Type: application/x-www-form-urlencoded

          client_id=springboot-client&username=felord&password=123456&grant_type=password

          會得到:

          {
              "access_token""eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiS 省略",
              "expires_in": 300,
              "refresh_expires_in": 1800,
              "refresh_token""eyJhbGciOiJIUzI1NiIsInR5cCIgOiAi 省略",
              "token_type""Bearer",
              "not-before-policy": 0,
              "session_state""2fc7e289-c86f-4f6f-b4d3-1183a9518acc",
              "scope""profile email"
          }

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

          POST /auth/realms/felord.cn/protocol/openid-connect/token HTTP/1.1
          Host: localhost:8011
          Content-Type: application/x-www-form-urlencoded

          client_id=springboot-client&grant_type=refresh_token&refresh_token=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlYWE2MThhMC05Y2UzLTQxZWMtOTZjYy04MGQ5ODVkZjJjMTIifQ.eyJleHAiOjE2MjU3NjI4ODYsImlhdCI6MTYyNTc2MTA4NiwianRpIjoiZjc2MjVmZmEtZWU3YS00MjZmLWIwYmQtOTM3MmZiM2Q4NDA5IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDExL2F1dGgvcmVhbG1zL2ZlbG9yZC5jbiIsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODAxMS9hdXRoL3JlYWxtcy9mZWxvcmQuY24iLCJzdWIiOiI0YzFmNWRiNS04MjU0LTQ4ZDMtYTRkYS0wY2FhZTMyOTk0OTAiLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoic3ByaW5nYm9vdC1jbGllbnQiLCJzZXNzaW9uX3N0YXRlIjoiZDU2NmU0ODMtYzc5MS00OTliLTg2M2ItODczY2YyNjMwYWFmIiwic2NvcGUiOiJwcm9maWxlIGVtYWlsIn0.P4vWwyfGubSt182P-vcyMdKvJfvwKYr1nUlOYBWzQks

          ?

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

          Spring Boot客戶端

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

                  <dependency>
                      <groupId>org.keycloak</groupId>
                      <artifactId>keycloak-spring-boot-starter</artifactId>
                      <version>14.0.0</version>
                  </dependency>

          ?

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

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

          /**
           * @author felord.cn
           * @since 2021/7/7 17:05
           */

          @RestController
          @RequestMapping("/foo")
          public class FooController {

              @GetMapping("/bar")
              public String bar(){
                  return "felord.cn";
              }

          }

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

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

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

          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)模式。只有你正確填寫了用戶名和密碼才能得到/foo/bar的正確響應(yīng)。

          總結(jié)

          ?

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

          我們僅僅進(jìn)行了一些配置就實(shí)現(xiàn)了OIDC認(rèn)證授權(quán),保護(hù)了Spring Boot中的接口,這真是太簡單了。不過看了這一篇文章后你會有不少疑問,這是因?yàn)槟悴惶私?strong style="color: rgb(53, 179, 120);">OIDC協(xié)議。這個(gè)協(xié)議非常重要,大廠都在使用這個(gè)協(xié)議。下一篇會針對這個(gè)協(xié)議來給你補(bǔ)補(bǔ)課。

          本文的DEMO已經(jīng)上傳到Git,你可以關(guān)注公眾號:碼農(nóng)小胖哥 回復(fù) keycloak3獲取DEMO。多多點(diǎn)贊、再看、轉(zhuǎn)發(fā)、評論、有飯恰才是胖哥創(chuàng)作分享的動力。


          往期推薦

          Spring Boot 2.x基礎(chǔ)教程:使用@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)

          昨晚,B站崩了!看了網(wǎng)友們的評論,我差點(diǎn)笑死...

          這些 IDEA 的優(yōu)化設(shè)置趕緊安排起來,效率提升不是一點(diǎn)點(diǎn)!

          服務(wù)發(fā)布或重啟,發(fā)生抖動怎么辦?

          什么?超過60%的開發(fā)者都開始從Java 8 升級到 Java 11了?


          瀏覽 48
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色屄影院 | 久久鸡巴视频 | 无遮挡一区二区 | 影音先锋成人无码影院 | 粉嫩在线 |