精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

全面解析 Keycloak:如何優雅集成到 Spring Boot 3 應用中?

開發 前端
本文詳細介紹了如何通過 Keycloak 生成 JWT 令牌,并將其與 Spring Boot 集成,實現基于角色的權限控制。通過配置 Keycloak 生成令牌,設置 Spring Security 的 JWT 解析邏輯,以及定義基于角色的訪問控制,我們構建了一個安全、高效的認證與授權機制。

Keycloak 是一種開源身份和訪問管理工具,可以幫助用戶以最小的努力為應用程序添加身份驗證功能。

Keycloak 的一些主要特性

  1. 單點登錄與單點注銷 (Single Sign-On and Single Sign-Out):用戶不需要為不同的應用程序設置不同的登錄賬號。
  2. 社交登錄與身份代理 (Social Login and Identity Brokering):支持使用 Google、Facebook 等社交登錄功能,并可以輕松配置已有的身份提供商。
  3. 用戶聯合 (User Federation):內置支持連接現有的 LDAP 和 Active Directory 服務器。
  4. 管理控制臺 (Admin Console)。
  5. 授權服務 (Authorisation Services):幫助管理所有客戶服務的權限,支持細粒度的權限控制。

了解 Keycloak 的幾個重要術語

  1. Realm (領域):一個安全域,用于管理用戶、應用程序、組和權限,便于資源、權限和配置的隔離與組織。
  2. Client (客戶端):能夠請求用戶身份驗證的應用程序或服務。
  3. Client Scopes (客戶端范圍):多個客戶端之間共享的通用規則和權限。
  4. Realm Roles (領域角色):在當前領域范圍內定義的角色。

Keycloak 入門

我們可以通過 Docker 啟動 Keycloak 服務器。使用以下命令啟動 Keycloak 服務器:

docker run -p8081:8080 -eKEYCLOAK_ADMIN=admin -eKEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:25.0.4 start-dev

服務器將啟動在 8081 端口。默認用戶名和密碼是 admin。可以通過瀏覽器訪問 localhost:8081/admin。

以下是管理控制臺的界面:

圖片圖片

創建領域 (Realm)

首先,我們需要創建一個領域來管理用戶和應用程序。創建領域的方法如下:

  1. 點擊左側的 Realm。
  2. 然后點擊 Create。

圖片

創建用戶

創建用戶的步驟如下:

  1. 點擊左側的 Users。
  2. 點擊 Add User 按鈕。接著會出現一個如下的表單:

圖片

添加客戶端 (Client)

可以按以下步驟添加我們的應用程序或服務:

  1. 點擊左側的 Clients。
  2. 點擊 Create Client。
  3. 接下來會出現一個表單,如下圖 Screenshot_1 所示。在連接 Spring Boot 應用程序和 Keycloak 時,ClientId 非常重要。
  4. 在 Root URL 中填寫 Spring Boot 應用的基礎 URL (參考下圖 Screenshot_2)。
  5. 完成后的表單看起來如 Screenshot_3 所示。

圖片圖片

圖片圖片

圖片圖片

創建客戶端后,可以為該客戶端創建 Roles (角色)。

這些角色可以分配給用戶,用戶將根據權限訪問不同的端點。

假設我們創建了兩個用戶 testadmin 和 testuser,同時創建了兩個角色 client_admin 和 client_user。

圖片圖片

如何使用 Keycloak 生成 JWT Token?

您需要通過 HTTP POST 方法向以下 URL 發送請求:http://localhost:8081/realms/master/protocol/openid-connect/token (假設 Keycloak 服務器運行在 localhost:8081)

請求體

請求體應為 x-www-form-urlencoded 類型,并包含以下參數:

  • grant_type(文本)— 表示請求所用的授權類型。
  • client_id(文本)— 請求的客戶端標識符。
  • username(文本)— 用于身份驗證的用戶名。
  • password(文本)— 用于身份驗證的密碼。

示例請求體

grant_type:password
client_id:keycloak-integration-app
username:testuser
password:testuser

如果請求成功,API 將返回一個包含 access token 的 JSON 響應。此 Token 可用于調用我們 Spring Boot 應用的各種接口。

將 Keycloak 集成到 Spring Boot 中

創建一個簡單的 Spring Boot 應用,并添加以下依賴

  1. Spring Web
  2. Spring Security
  3. Lombok
  4. OAuth2 Authorization Server
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

創建 SecurityConfig 類:

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@RequiredArgsConstructor
public class SecurityConfig {


    private final JwtConvertor jwtConvertor;


    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {


        httpSecurity
                .csrf(csrf -> csrf.disable())
                .authorizeHttpRequests(auth -> auth.anyRequest().authenticated());


        httpSecurity
                .oauth2ResourceServer(oauth2 -> oauth2
                        .jwt(jwt -> jwt
                                .jwtAuthenticationConverter(jwtConvertor)));


        httpSecurity
                .sessionManagement(sessMngmt ->
                        sessMngmt.sessionCreationPolicy(SessionCreationPolicy.STATELESS));


        return httpSecurity.build();
    }
}

創建 JwtConvertor 類以提取角色。

以下是解碼 JWT 時的角色 JSON 示例:

"resource_access": {
"keycloak-integration-app": {
"roles": [
"client_admin"
]
},
"account": {
"roles": [
"manage-account",
"manage-account-links",
"view-profile"
]
}
}

為了獲取角色,我們需要創建一個轉換器類:

public class JwtConvertor implements Converter<Jwt, AbstractAuthenticationToken> {


    private final JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter =
            new JwtGrantedAuthoritiesConverter();


    private String principleAttribute;


    @Override
    public AbstractAuthenticationToken convert(Jwt source) {
        Collection<GrantedAuthority> authorities = Stream.concat(
                jwtGrantedAuthoritiesConverter.convert(source).stream(),
                extractResourceRoles(source).stream()
        ).collect(Collectors.toSet());


        return new JwtAuthenticationToken(
                source,
                authorities,
                getPrincipleClaimName(source)
        );
    }


    private String getPrincipleClaimName(Jwt source) {
        String claimName = JwtClaimNames.SUB;
        if (principleAttribute != null) {
            claimName = principleAttribute;
        }
        return source.getClaim(claimName);
    }


    private Collection<? extends GrantedAuthority> extractResourceRoles(Jwt jwt) {
        Map<String, Object> resourceAccess;
        Map<String, Object> resource;
        Collection<String> resourceRoles;
        if (jwt.getClaim("resource_access") == null) {
            return Set.of();
        }
        resourceAccess = jwt.getClaim("resource_access");


        if (resourceAccess.get("keycloak-integration-app") == null) {
            return Set.of();
        }
        resource = (Map<String, Object>) resourceAccess.get("keycloak-integration-app");


        resourceRoles = (Collection<String>) resource.get("roles");
        return resourceRoles
                .stream()
                .map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                .collect(Collectors.toSet());
    }
}

在 application.yml 中添加配置:

spring:
application:
name: keycloak-integration
security:
oauth2:
resourceserver:
jwt:
issuer-uri: sample_issuer_uri
jwk-set-uri: sample_cert

可以通過以下 GET API 獲取 issuer-uri 和 jwk-set-uri:

http://localhost:8081/realms/{realm_name}/.well-known/openid-configuration

## 將 {realm_name} 替換為您的 Realm 名稱

創建 REST Controller

@RestController
@RequestMapping(value = "/data")
public class DataController {


    @GetMapping(value = "/user")
    @PreAuthorize("hasRole('client_user')")
    public String userApi(){
        return "I am a user";
    }


    @GetMapping(value = "/admin")
    @PreAuthorize("hasRole('client_admin')")
    public String adminApi(){
        return "I am an Admin";
    }
}

我們的集成現在已經完成,可以通過生成 Keycloak 的 access token 來訪問 API(如上所述)。

使用 testuser 的 JWT 調用 /data/admin 接口時,會返回 403,但可以正常訪問 /data/user。對于 testadmin 用戶也是如此。

資源

  1. Keycloak 入門文檔請參閱 https://www.keycloak.org/guides#getting-started。
  2. JWT 官網https://jwt.io/

總結

本文詳細介紹了如何通過 Keycloak 生成 JWT 令牌,并將其與 Spring Boot 集成,實現基于角色的權限控制。

通過配置 Keycloak 生成令牌,設置 Spring Security 的 JWT 解析邏輯,以及定義基于角色的訪問控制,我們構建了一個安全、高效的認證與授權機制。

這套流程為應用的安全性和擴展性提供了保障,適用于多角色分布式系統開發。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2021-07-09 06:48:29

Spring Boot應用Keycloak

2025-07-25 09:24:16

2021-01-07 14:06:30

Spring BootJUnit5Java

2025-01-02 11:20:47

2020-07-14 11:00:12

Spring BootRedisJava

2022-10-26 07:14:25

Spring 6Spring業務

2021-08-26 11:00:54

Spring BootJUnit5Java

2024-12-06 09:27:28

2020-09-02 17:28:26

Spring Boot Redis集成

2025-09-12 07:13:32

2024-10-11 11:46:40

2024-09-27 12:27:31

2023-11-01 08:58:10

2021-03-09 13:18:53

加密解密參數

2022-06-04 12:25:10

解密加密過濾器

2025-03-28 08:34:34

2025-02-07 09:11:04

JSON對象策略

2024-10-08 09:27:04

SpringRESTfulAPI

2022-05-12 11:38:26

Java日志Slf4j

2024-01-16 08:17:29

Mybatis驗證業務
點贊
收藏

51CTO技術棧公眾號

99热99这里只有精品| 黄色免费网址大全| 五月天激情开心网| 日韩高清不卡在线| 久热精品视频在线免费观看| 动漫美女无遮挡免费| 久久r热视频| 亚洲欧美综合网| 狠狠色综合网站久久久久久久| 日本视频免费观看| 欧美日韩1区| 亚洲欧美中文日韩v在线观看| 中文字幕第38页| 7777kkk亚洲综合欧美网站| 国产亚洲欧美一级| 99热在线播放| 中文字幕一区二区人妻痴汉电车| 国产精品激情| 久久精品成人欧美大片古装| 国产精品无码专区| 国产一区二区三区免费观看在线 | 亚洲国产精品久久精品怡红院| 人妻无码视频一区二区三区| 免费污视频在线| 国产精品成人一区二区艾草| 狠狠干一区二区| 亚洲第一页视频| 韩国成人福利片在线播放| 日韩av片免费在线观看| 国产一级片久久| 午夜精品久久久久久久四虎美女版| 亚洲裸体xxxx| 欧美熟妇精品一区二区蜜桃视频| 国产精品99久久免费| 欧美中文字幕不卡| 成人午夜视频免费在线观看| 国产网站在线| 亚洲不卡在线观看| 青草视频在线观看视频| caopen在线视频| 国产精品国产自产拍高清av| 日韩激情久久| 黄色片在线免费观看| 91亚洲精华国产精华精华液| 99re国产视频| 亚洲第一天堂网| 国产精品系列在线观看| 成人av番号网| 国产精品久久久久久久久久久久久久久久| 日韩一区欧美二区| 欧美性视频在线| 99久久精品国产亚洲| 亚洲综合国产激情另类一区| 国内外成人免费激情在线视频网站 | 东京久久高清| 精品国产1区二区| 中文字幕乱码一区| 久久大胆人体视频| 日韩精品视频在线播放| 五月婷婷综合在线观看| 九九热播视频在线精品6| 亚洲国产精久久久久久| 成人影视免费观看| 精品高清久久| 日韩在线观看免费| 免费中文字幕在线观看| 日韩一区二区久久| 欧美一级在线亚洲天堂| 中文字幕免费高清网站| 麻豆久久一区二区| 亚洲淫片在线视频| 日本免费网站在线观看| 久久夜色精品国产欧美乱极品| 欧美一级爽aaaaa大片| 成黄免费在线| 亚洲激情男女视频| 91视频 -- 69xx| 欧美成人精品三级网站| 欧美日韩国产综合一区二区三区| 三年中文在线观看免费大全中国| 亚洲va欧美va人人爽成人影院| 亚洲国产小视频在线观看| 成人区人妻精品一区二| 国语产色综合| 欧美情侣性视频| 影音先锋在线国产| 国产呦萝稀缺另类资源| 极品校花啪啪激情久久| 成人性爱视频在线观看| 一区二区三区资源| 日本黄网站免费| 免费精品一区| 亚洲欧美中文字幕| www.毛片com| 羞羞答答国产精品www一本| 国产又爽又黄的激情精品视频 | 亚洲男人的天堂在线视频| 日韩精品一卡二卡三卡四卡无卡 | 日本久久成人网| 中文字幕在线观看亚洲| 懂色av.com| 蜜桃免费网站一区二区三区| 国产久一道中文一区| a天堂在线资源| 午夜精品久久久久久久99樱桃| 国产一二三区av| 欧美调教视频| 欧美精品一二区| 少妇一级淫片日本| jlzzjlzz国产精品久久| 午夜探花在线观看| 影音成人av| 国产视频在线观看一区二区| 中文字幕手机在线观看| 免费一区二区视频| 久久狠狠久久综合桃花| 在线黄色网页| 欧美乱妇15p| 日本少妇高潮喷水xxxxxxx| 精品成人久久| 亚洲伊人一本大道中文字幕| 尤物在线视频| 在线视频欧美精品| 中文字幕一区二区久久人妻网站| 综合久久婷婷| 91久久精品视频| av大全在线免费看| 一本大道av伊人久久综合| 久久久高清视频| 午夜欧美精品| 成人国产精品一区二区| 国产私人尤物无码不卡| 日韩欧美999| 日本免费福利视频| 亚洲一区不卡| 久久手机视频| 日韩欧美精品一区二区三区| 亚洲风情亚aⅴ在线发布| 青娱乐国产精品| 国产一区免费电影| 黄色高清视频网站| 成人在线日韩| 久久综合亚洲社区| 国产高潮流白浆喷水视频| 亚洲乱码中文字幕| 91av免费观看| 国产精品hd| 成人资源视频网站免费| 国产盗摄一区二区| 亚洲国产精品成人精品| 日韩污视频在线观看| a美女胸又www黄视频久久| 久久精品国产sm调教网站演员| 成人在线视频你懂的| 久久免费福利视频| 五月婷婷狠狠干| 日韩欧亚中文在线| 天天躁夜夜躁狠狠是什么心态| 麻豆精品91| 日韩欧美亚洲在线| 日韩黄色三级| 欧美老女人在线视频| 亚洲欧美高清视频| 欧美日韩国产精品一区二区三区四区 | 日韩乱码人妻无码中文字幕| 91在线一区二区三区| 天天摸天天碰天天添| 精品国产精品久久一区免费式| 国产精品视频精品| av片在线观看| 日韩av网站在线| 特级西西444www高清大视频| 成人欧美一区二区三区视频网页| 久久久久亚洲av片无码v| 亚洲视频综合| 日韩欧美一区二区三区四区| 经典三级久久| 8090成年在线看片午夜| www.亚洲.com| 日韩午夜激情av| 国产欧美一区二区三区在线看蜜臂| 久久精品男人天堂av| 午夜免费看毛片| 在线精品观看| 先锋影音日韩| 国产精品videossex| 国产97在线视频| 午夜羞羞小视频在线观看| 亚洲免费视频观看| 国产视频第一页| 欧美视频中文字幕在线| 91久久久久久久久久久久久久 | 九九热最新地址| 91精品国产乱码久久久久久 | 成年人免费在线播放| 91综合久久| 麻豆av一区二区| 美女日韩一区| 国产精品免费一区| 91探花在线观看| 久久精品视频一| 久久经典视频| 亚洲成avwww人| 国产又爽又黄又嫩又猛又粗| 天天色综合成人网| 永久免费看黄网站| 国产精品视频一二| 制服丝袜第二页| 国产精品12区| 亚洲小视频网站| 久久黄色影院| www.射射射| 综合一区在线| 亚洲日本japanese丝袜| 蜜臀av免费一区二区三区| 99久久99久久| 99久久久成人国产精品| 国产精品福利观看| 伊人久久在线| 欧美一区二粉嫩精品国产一线天| 欧美人与禽性xxxxx杂性| 日韩网站免费观看高清| 国产黄在线看| 亚洲欧洲在线看| 亚洲欧洲综合在线| 亚洲国产婷婷香蕉久久久久久| 精品人妻一区二区三区麻豆91 | 国产日韩av高清| 欧美色网在线| 日韩免费av一区二区| 日韩在线伦理| 91福利视频在线观看| 888av在线视频| 国内揄拍国内精品| 超碰高清在线| 98精品国产高清在线xxxx天堂| 青草在线视频在线观看| 久久影视电视剧免费网站| 欧美激情午夜| 久久久久北条麻妃免费看| 毛片在线播放a| 久久综合电影一区| 综合图区亚洲| 欧美高清视频免费观看| 手机av免费在线| 久操成人在线视频| 乱插在线www| 国语自产精品视频在线看一大j8 | x88av在线| 国产欧美精品一区| 黄色一级片一级片| 成人欧美一区二区三区小说| 午夜少妇久久久久久久久| 亚洲免费色视频| 久久久精品国产sm调教网站| 亚洲第一在线综合网站| 欧美成人精品欧美一级乱黄| 精品美女永久免费视频| www.国产毛片| 欧美日韩在线播放一区| 国产乱淫a∨片免费视频| 日韩一区二区三区高清免费看看| 成人毛片在线精品国产| 日韩精品久久久久久福利| 国内三级在线观看| xxx欧美精品| 黄页网站在线| 日本精品久久久久久久| 国产香蕉久久| 国产超碰91| 国产成人手机高清在线观看网站| 日韩精品一区二区三区色偷偷| 91综合久久| 你懂的av在线| 麻豆91在线播放免费| 成年女人免费视频| 国产日本欧美一区二区| 日本aⅴ在线观看| 精品久久久久久中文字幕大豆网| 中文字幕 亚洲视频| 日韩一级大片在线| 日韩欧美亚洲系列| 久久这里只有精品视频首页| 91豆花视频在线播放| 国产美女扒开尿口久久久| 99re91这里只有精品| 日韩福利影院| 一区在线视频| 国产无色aaa| 99re亚洲国产精品| 麻豆明星ai换脸视频| 天天操天天综合网| 国产伦精品一区二区三区免.费| 亚洲福利影片在线| 免费av在线| 热久久免费视频精品| 日韩精品中文字幕吗一区二区| 欧洲亚洲一区二区| 亚洲第一黄网| 91精产国品一二三产区别沈先生| 91久色porny| 在线免费日韩av| 欧美网站大全在线观看| 少妇av在线播放| 成人444kkkk在线观看| 欧美成a人片在线观看久| 国产另类自拍| 久久久久久久久久久久久久| 日韩欧美xxxx| 波多野结衣中文字幕一区| 91香蕉一区二区三区在线观看| 精品久久中文字幕久久av| 亚洲第一第二区| 俺也去精品视频在线观看| 芒果视频成人app| 九色一区二区| 亚洲承认在线| av电影中文字幕| 亚洲少妇最新在线视频| 在线免费av网| 国产一区二区三区在线免费观看| 僵尸再翻生在线观看| 超碰97在线人人| 午夜精品久久久久99热蜜桃导演 | 蜜臀视频一区二区三区| 99亚偷拍自图区亚洲| 国产一级黄色av| 日韩一区二区三区视频| а√天堂官网中文在线| 成人精品在线观看| 日韩在线观看电影完整版高清免费悬疑悬疑 | 美女国产精品| 日本黄色特级片| 午夜精品福利久久久| 免费成人在线看| 久久久久久亚洲| 国产精品色呦| 日本韩国欧美在线观看| 99久久精品国产导航| 免费一级片在线观看| 欧美mv和日韩mv国产网站| 欧美人与性动交α欧美精品图片| 97se亚洲综合在线| 合欧美一区二区三区| youjizz.com国产| 欧美日韩免费一区| 欧美欧美欧美| 国产精品高潮视频| 精品国产91久久久久久浪潮蜜月| 熟女人妇 成熟妇女系列视频| 国产农村妇女毛片精品久久麻豆 | 亚洲精品555| 亚洲国产综合自拍| 国产在线视频一区二区| 校园春色 亚洲| 亚洲国产精品女人久久久| 亚洲第一av| 亚洲v国产v在线观看| 精品一区二区三区在线播放视频| 国产精品国产三级国产传播| 欧美成人在线直播| 激情黄产视频在线免费观看| 欧美日韩免费精品| 麻豆国产精品一区二区三区| 欧美丰满熟妇bbbbbb| 精品美女一区二区三区| 亚洲欧美韩国| 亚洲巨乳在线观看| 国产高清亚洲一区| 久久久免费高清视频| 日韩视频在线免费观看| 国产精品主播在线观看| 青青青在线播放| 亚洲欧美怡红院| 深夜福利视频网站| 国产精品久久久久一区二区| 91精品成人| 国产艳俗歌舞表演hd| 精品视频一区三区九区| 日本孕妇大胆孕交无码| 欧美日韩一区在线观看视频| 狠狠色丁香九九婷婷综合五月| 久久精品一区二区三| 一本色道久久88综合亚洲精品ⅰ| 国产999精品在线观看| 欧美国产激情视频| 最新国产成人在线观看| 污视频在线免费观看| 国产伦精品免费视频| 亚洲精品少妇| 中国一级片在线观看| 亚洲欧美日韩精品久久奇米色影视| av在线精品| 天天摸天天碰天天添| 亚洲一区在线视频观看| av在线1区2区| 久久亚洲免费| 国产成人在线网站| 91丨porny丨在线中文 | 中文乱码免费一区二区|