Spring?Boot?3.1中整合Spring?Security和Keycloak的方法
在今年2月14日的時(shí)候,Keycloak 團(tuán)隊(duì)宣布他們正在棄用大多數(shù) Keycloak 適配器。其中包括Spring Security和Spring Boot的適配器,這意味著今后Keycloak團(tuán)隊(duì)將不再提供針對Spring Security和Spring Boot的集成方案。但是,如此強(qiáng)大的Keycloak,還要用怎么辦呢?本文就來聊聊,在最新的Spring Boot 3.1版本之下,如何將Keycloak和Spring Security一起跑起來。
準(zhǔn)備工作
這里所采用的框架與工具版本信息如下:
- Spring Boot 3.1.0
- Keycloak 21.1.1
如果您采用的是其他版本,本文內(nèi)容不一定有效,但可以作為參考。
配置Keycloak
第一步:為Spring Boot應(yīng)用創(chuàng)建Realm,并在下面創(chuàng)建一個(gè)Client

第二步:創(chuàng)建一個(gè)SYS_ADMIN角色,并創(chuàng)建一個(gè)用戶賦予SYS_ADMIN角色
第三步:調(diào)用Keycloak接口生成Access Token,可以用下面的curl命令或者其他任何發(fā)請求的工具,比如:Postman等。
curl --location 'http://localhost:9090/realms/MyAppRealm/protocol/openid-connect/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'username=<YOUR_USER_NAME>' \ --data-urlencode 'password=<YOUR_USER_PASSWORD>' \ --data-urlencode 'grant_type=password' \ --data-urlencode 'client_id=My-Awesome-App' \ --data-urlencode 'client_secret=<KEYCLOAK_CLIENT_SECRET>' \ --data-urlencode 'scope=openid'
記住獲得到Access Token,后續(xù)驗(yàn)證時(shí)候要用。
配置Spring Boot應(yīng)用
第一步:創(chuàng)建一個(gè)Spring Boot應(yīng)用,這個(gè)很簡單,這里不贅述了。如果您還不會(huì),可以看看我的Spring Boot教程
第二步:在pom.xml中添加依賴:
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-jose</artifactId> </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)的測試接口
@RequestMapping("/test")
@RestController
public class MySuperSecuredController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}第五步:創(chuàng)建SecurityFilterChain,用來告知Spring Security在JWT令牌中查找角色信息的位置。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeHttpRequests(registry -> registry
.requestMatchers("/test/**").hasRole("SYS_ADMIN")
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2Configurer -> oauth2Configurer.jwt(jwtConfigurer -> jwtConfigurer.jwtAuthenticationConverter(jwt -> {
Map<String, Collection<String>> realmAccess = jwt.getClaim("realm_access");
Collection<String> roles = realmAccess.get("roles");
var grantedAuthorities = roles.stream()
.map(role -> new SimpleGrantedAuthority("ROLE_" + role))
.toList();
return new JwtAuthenticationToken(jwt, grantedAuthorities);
})))
;
return httpSecurity.build();
}
}驗(yàn)證一下
在完成了上面配置所有之后之后,啟動(dòng)Spring Boot應(yīng)用,同時(shí)保證Keycloak也在運(yùn)行中。
嘗試請求/test/hello接口:
- 當(dāng)不包含
Authorization頭信息的時(shí)候,將返回401錯(cuò)誤 - 當(dāng)包含
Authorization頭信息(前文用調(diào)接口獲取的Access Token)的時(shí)候,才能正確訪問到。
小結(jié)
雖然Keycloak 團(tuán)隊(duì)宣布了不再對Spring Security提供適配,但Spring Security長期以來一直為OAuth和OIDC提供強(qiáng)大的內(nèi)置支持。所以,只要我們理解Spring Security是如何處理OAuth和OIDC的,那么與Keyloak的集成依然不復(fù)雜。
到此這篇關(guān)于Spring Boot 3.1中如何整合Spring Security和Keycloak的文章就介紹到這了,更多相關(guān)Spring Boot 3.1整合Spring Security和Keycloak內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot如何整合Springsecurity實(shí)現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制
- SpringBoot2.0 整合 SpringSecurity 框架實(shí)現(xiàn)用戶權(quán)限安全管理方法
- Spring Boot整合Spring Security簡單實(shí)現(xiàn)登入登出從零搭建教程
- Spring Boot整合Spring Security的示例代碼
- SpringBoot整合Keycloak實(shí)現(xiàn)單點(diǎn)登錄的示例代碼
- Spring Boot/Angular整合Keycloak實(shí)現(xiàn)單點(diǎn)登錄功能
相關(guān)文章
java synchronized同步靜態(tài)方法和同步非靜態(tài)方法的異同
這篇文章主要介紹了java synchronized同步靜態(tài)方法和同步非靜態(tài)方法的異同的相關(guān)資料,需要的朋友可以參考下2017-01-01
SpringBoot3實(shí)現(xiàn)MySQL讀寫分離的完整指南
在高并發(fā)場景下,數(shù)據(jù)庫往往成為系統(tǒng)瓶頸,讀寫分離通過將寫操作定向到主庫、讀操作分發(fā)到從庫,顯著提升系統(tǒng)讀性能和數(shù)據(jù)可用性,本文給大家介紹了SpringBoot3實(shí)現(xiàn)MySQL讀寫分離的完整指南,需要的朋友可以參考下2025-11-11
@Autowired一個(gè)接口有多個(gè)實(shí)現(xiàn)類的情況
本文介紹了Spring中@Autowired注解的注入原理,默認(rèn)按類型(byType)注入,當(dāng)存在多個(gè)實(shí)現(xiàn)類時(shí),會(huì)報(bào)錯(cuò),可以通過修改變量名或配合@Qualifier注解,指定注入具體實(shí)現(xiàn)類,變?yōu)榘疵Q(byName)注入2025-10-10
Java面試之限流的實(shí)現(xiàn)方式小結(jié)
限流是指在各種應(yīng)用場景中,通過技術(shù)和策略手段對數(shù)據(jù)流量、請求頻率或資源消耗進(jìn)行有計(jì)劃的限制,本文為大家整理了常見的限流的實(shí)現(xiàn)方式,有需要的可以參考下2024-02-02
Java通過notify和wait實(shí)現(xiàn)線程間的通信功能
在軟件開發(fā)中,線程是實(shí)現(xiàn)并發(fā)執(zhí)行的重要手段,然而,線程之間的協(xié)作與通信卻是開發(fā)者必須重點(diǎn)考慮的挑戰(zhàn)之一,Java作為一種廣泛應(yīng)用于多線程編程的語言,本文將深入探討Java中通過notify和wait實(shí)現(xiàn)線程間通信的機(jī)制,需要的朋友可以參考下2024-06-06
java實(shí)現(xiàn)oracle插入當(dāng)前時(shí)間的方法
這篇文章主要介紹了java實(shí)現(xiàn)oracle插入當(dāng)前時(shí)間的方法,以實(shí)例形式對比分析了java使用Oracle操作時(shí)間的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
java實(shí)現(xiàn)文件變化監(jiān)控的方法(推薦)
下面小編就為大家?guī)硪黄猨ava實(shí)現(xiàn)文件變化監(jiān)控的方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08

