0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring Boot 3.1 中如何整合Spring Security和Keycloak

jf_ro2CN3Fa ? 來(lái)源:程序猿DD ? 2023-06-08 14:54 ? 次閱讀


7bfd843c-0580-11ee-8a94-dac502259ad0.png

在今年2月14日的時(shí)候,Keycloak 團(tuán)隊(duì)宣布他們正在棄用大多數(shù) Keycloak 適配器。其中包括Spring Security和Spring Boot的適配器,這意味著今后Keycloak團(tuán)隊(duì)將不再提供針對(duì)Spring Security和Spring Boot的集成方案。

7c0957da-0580-11ee-8a94-dac502259ad0.png

但是,如此強(qiáng)大的Keycloak,還要用怎么辦呢?本文就來(lái)聊聊,在最新的Spring Boot 3.1版本之下,如何將Keycloak和Spring Security一起跑起來(lái)。

準(zhǔn)備工作

這里所采用的框架與工具版本信息如下:

  • Spring Boot 3.1.0
  • Keycloak 21.1.1

如果您采用的是其他版本,本文內(nèi)容不一定有效,但可以作為參考。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

配置Keycloak

第一步:為Spring Boot應(yīng)用創(chuàng)建Realm,并在下面創(chuàng)建一個(gè)Client

7c1234cc-0580-11ee-8a94-dac502259ad0.png

第二步:創(chuàng)建一個(gè)SYS_ADMIN角色,并創(chuàng)建一個(gè)用戶(hù)賦予SYS_ADMIN角色

第三步:調(diào)用Keycloak接口生成Access Token,可以用下面的curl命令或者其他任何發(fā)請(qǐng)求的工具,比如:Postman等。

curl--location'http://localhost:9090/realms/MyAppRealm/protocol/openid-connect/token'
--header'Content-Type:application/x-www-form-urlencoded'
--data-urlencode'username='
--data-urlencode'password='
--data-urlencode'grant_type=password'
--data-urlencode'client_id=My-Awesome-App'
--data-urlencode'client_secret='
--data-urlencode'scope=openid'

記住獲得到Access Token,后續(xù)驗(yàn)證時(shí)候要用。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

配置Spring Boot應(yīng)用

第一步:創(chuàng)建一個(gè)Spring Boot應(yīng)用,這個(gè)很簡(jiǎn)單,這里不贅述了。

第二步:在pom.xml中添加依賴(lài):

<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-oauth2-joseartifactId>
dependency>

第三步:修改配置文件

spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri:http://localhost:9090/realms/MyAppRealm
jwk-set-uri:http://localhost:9090/realms/MyAppRealm/protocol/openid-connect/certs

第四步:創(chuàng)建一個(gè)需要鑒權(quán)的測(cè)試接口

@RequestMapping("/test")
@RestController
publicclassMySuperSecuredController{

@GetMapping("/hello")
publicStringhello(){
return"hello";
}

}

第五步:創(chuàng)建SecurityFilterChain,用來(lái)告知Spring Security在JWT令牌中查找角色信息的位置。

@Configuration
@EnableWebSecurity
publicclassWebSecurityConfig{


@Bean
publicSecurityFilterChainsecurityFilterChain(HttpSecurityhttpSecurity)throwsException{
httpSecurity
.authorizeHttpRequests(registry->registry
.requestMatchers("/test/**").hasRole("SYS_ADMIN")
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2Configurer->oauth2Configurer.jwt(jwtConfigurer->jwtConfigurer.jwtAuthenticationConverter(jwt->{
Map>realmAccess=jwt.getClaim("realm_access");
Collectionroles=realmAccess.get("roles");
vargrantedAuthorities=roles.stream()
.map(role->newSimpleGrantedAuthority("ROLE_"+role))
.toList();
returnnewJwtAuthenticationToken(jwt,grantedAuthorities);
})))
;

returnhttpSecurity.build();
}
}

驗(yàn)證一下

在完成了上面配置所有之后之后,啟動(dòng)Spring Boot應(yīng)用,同時(shí)保證Keycloak也在運(yùn)行中。

嘗試請(qǐng)求/test/hello接口:

  • 當(dāng)不包含Authorization頭信息的時(shí)候,將返回401錯(cuò)誤
  • 當(dāng)包含Authorization頭信息(前文用調(diào)接口獲取的Access Token)的時(shí)候,才能正確訪(fǎng)問(wèn)到。

小結(jié)

雖然Keycloak 團(tuán)隊(duì)宣布了不再對(duì)Spring Security提供適配,但Spring Security長(zhǎng)期以來(lái)一直為OAuth和OIDC提供強(qiáng)大的內(nèi)置支持。所以,只要我們理解Spring Security是如何處理OAuth和OIDC的,那么與Keyloak的集成依然不復(fù)雜。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 適配器
    +關(guān)注

    關(guān)注

    8

    文章

    1952

    瀏覽量

    68024
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    403

    瀏覽量

    17483
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14343

原文標(biāo)題:Spring Boot 3.1 中如何整合Spring Security和Keycloak

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Spring bootRedis的使用

    【本人禿頂程序員】springboot專(zhuān)輯:Spring bootRedis的使用
    發(fā)表于 03-27 11:42

    Mybatis整合spring的思路和步驟

    1、整合思路(1)SqlSessionFactory對(duì)象應(yīng)該放到spring容器作為單例存在。(2)傳統(tǒng)dao的開(kāi)發(fā)方式,應(yīng)該從spring
    發(fā)表于 11-04 09:06

    啟動(dòng)Spring Boot項(xiàng)目應(yīng)用的三種方法

    ,從而使開(kāi)發(fā)人員不再需要定義樣板化的配置。用我的話(huà)來(lái)理解,就是spring boot其實(shí)不是什么新的框架,它默認(rèn)配置了很多框架的使用方式,就像maven整合了所有的jar包,spring
    發(fā)表于 01-14 17:33

    Spring Boot嵌入式Web容器原理是什么

    Spring Boot嵌入式Web容器原理Spring Boot的目標(biāo)是構(gòu)建“非常容易創(chuàng)建、獨(dú)立、產(chǎn)品級(jí)別的基于Spring的應(yīng)用”。這些應(yīng)
    發(fā)表于 12-16 07:57

    Spring Boot從零入門(mén)1 詳述

    在開(kāi)始學(xué)習(xí)Spring Boot之前,我之前從未接觸過(guò)Spring相關(guān)的項(xiàng)目,Java基礎(chǔ)還是幾年前自學(xué)的,現(xiàn)在估計(jì)也忘得差不多了吧,寫(xiě)Spring
    的頭像 發(fā)表于 12-10 22:18 ?639次閱讀

    Spring認(rèn)證」什么是Spring GraphQL?

    這個(gè)項(xiàng)目建立在 Boot 2.x 上,但它應(yīng)該與最新的 Boot2.4.x5 相關(guān)。 要?jiǎng)?chuàng)建項(xiàng)目,請(qǐng)轉(zhuǎn)到start.spring.io并為要使用的GraphQL傳輸選擇啟動(dòng)器: 啟動(dòng)機(jī) 運(yùn)輸 執(zhí)行
    的頭像 發(fā)表于 08-10 14:08 ?825次閱讀
    「<b class='flag-5'>Spring</b>認(rèn)證」什么是<b class='flag-5'>Spring</b> GraphQL?

    Spring Boot特有的實(shí)踐

    Spring Boot是最流行的用于開(kāi)發(fā)微服務(wù)的Java框架。在本文中,我將與你分享自2016年以來(lái)我在專(zhuān)業(yè)開(kāi)發(fā)中使用Spring Boot所采用的最佳實(shí)踐。這些內(nèi)容是基于我的個(gè)人經(jīng)驗(yàn)
    的頭像 發(fā)表于 09-29 10:24 ?911次閱讀

    強(qiáng)大的Spring Boot 3.0要來(lái)了

    和 Bugfix。 Spring Boot 3.0 的開(kāi)發(fā)工作始于實(shí)驗(yàn)性的 Spring Native,旨在為 GraalVM 原生鏡像提供支持。 在該版本,開(kāi)發(fā)者現(xiàn)在可以使用標(biāo)準(zhǔn)
    的頭像 發(fā)表于 10-31 11:17 ?1874次閱讀

    Spring Boot整合兩種定時(shí)任務(wù)的方法

    框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具備這兩個(gè) Spring 的定時(shí)任務(wù)實(shí)現(xiàn)策
    的頭像 發(fā)表于 04-07 14:55 ?1550次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b><b class='flag-5'>中</b><b class='flag-5'>整合</b>兩種定時(shí)任務(wù)的方法

    Spring Boot如何使用定時(shí)任務(wù)

    本文介紹在 Spring Boot 如何使用定時(shí)任務(wù),使用非常簡(jiǎn)單,就不做過(guò)多說(shuō)明了。
    的頭像 發(fā)表于 04-12 10:56 ?974次閱讀

    Spring Boot Actuator快速入門(mén)

    不知道大家在寫(xiě) Spring Boot 項(xiàng)目的過(guò)程,使用過(guò) Spring Boot Actuator 嗎?知道
    的頭像 發(fā)表于 10-09 17:11 ?638次閱讀

    Spring Boot啟動(dòng) Eureka流程

    在上篇已經(jīng)說(shuō)過(guò)了 Eureka-Server 本質(zhì)上是一個(gè) web 應(yīng)用的項(xiàng)目,今天就來(lái)看看 Spring Boot 是怎么啟動(dòng) Eureka 的。 Spring
    的頭像 發(fā)表于 10-10 11:40 ?894次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>啟動(dòng) Eureka流程

    Spring Boot的啟動(dòng)原理

    可能很多初學(xué)者會(huì)比較困惑,Spring Boot 是如何做到將應(yīng)用代碼和所有的依賴(lài)打包成一個(gè)獨(dú)立的 Jar 包,因?yàn)閭鹘y(tǒng)的 Java 項(xiàng)目打包成 Jar 包之后,需要通過(guò) -classpath 屬性
    的頭像 發(fā)表于 10-13 11:44 ?650次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的啟動(dòng)原理

    Spring Boot 的設(shè)計(jì)目標(biāo)

    什么是Spring Boot Spring BootSpring 開(kāi)源組織下的一個(gè)子項(xiàng)目,也是 S
    的頭像 發(fā)表于 10-13 14:56 ?586次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設(shè)計(jì)目標(biāo)

    如何在Spring Boot應(yīng)用程序整合ZXing庫(kù)

    在數(shù)字化時(shí)代,二維碼已經(jīng)成為了信息交流的一種常見(jiàn)方式。它們被廣泛用于各種應(yīng)用,從產(chǎn)品標(biāo)簽到活動(dòng)傳單,以及電子支付。本文將向您展示如何在Spring Boot應(yīng)用程序整合ZXing庫(kù),
    的頭像 發(fā)表于 12-03 17:39 ?1089次閱讀