news 2026/6/22 4:36:43

如何在Java应用中集成Keycloak进行用户认证?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在Java应用中集成Keycloak进行用户认证?

一、前置准备

  1. 已部署好 Keycloak(参考之前的容器部署方式),并完成基础配置:
    • 创建一个 Realm(例如:my-realm
    • 创建一个 Client(例如:my-spring-app),Client Protocol 选择openid-connect,Access Type 选择confidential,Valid Redirect URIs 填写http://localhost:8081/*(Spring Boot 应用端口)
    • 记录 Client 的Client IDClient Secret(在 Client 的Credentials标签页)
    • 创建一个测试用户(例如:test-user,设置密码)
  2. Spring Boot 应用(2.7.x/3.x 均可,下文以 3.2.x 为例)

二、核心集成步骤(Spring Boot + Keycloak)

1. 添加 Maven 依赖

pom.xml中引入 Keycloak 与 Spring Security 集成的核心依赖:

xml

<!-- Spring Boot Starter Security(核心) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <!-- Keycloak Spring Boot Starter(简化集成) --> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-boot-starter</artifactId> <version>23.0.7</version> <!-- 与Keycloak服务版本保持一致 --> </dependency> <!-- Spring Boot Starter Web(用于编写测试接口) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2. 配置 application.yml

src/main/resources/application.yml中配置 Keycloak 连接信息和认证规则:

yaml

server: port: 8081 # Spring Boot应用端口 keycloak: # Keycloak服务地址 auth-server-url: http://localhost:8080/realms/my-realm # 对应Keycloak中创建的Client ID resource: my-spring-app # 对应Keycloak中Client的Secret(confidential类型需要) credentials: secret: <你的Client Secret> # 开启Bearer Token认证(API接口常用) bearer-only: true # 所属Realm realm: my-realm # 关闭自动创建用户(生产环境建议开启) use-resource-role-mappings: true spring: security: # 禁用默认的CSRF(仅测试用,生产环境根据场景决定) csrf: enabled: false
3. 编写 Spring Security 配置类

创建SecurityConfig.java,配置认证规则和 Keycloak 集成:

java

运行

import org.keycloak.adapters.springsecurity.KeycloakConfiguration; import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy; import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; /** * Keycloak安全配置类 */ @KeycloakConfiguration public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter { // 注入Keycloak认证提供者 @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) { KeycloakAuthenticationProvider provider = new KeycloakAuthenticationProvider(); // 统一角色前缀(Keycloak的Role默认不带ROLE_,Spring Security需要) provider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper()); auth.authenticationProvider(provider); } // 配置Session策略(无状态API用Null) @Bean @Override protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { return new NullAuthenticatedSessionStrategy(); } // 配置HTTP请求的认证规则 @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); http // 配置接口访问规则 .authorizeHttpRequests() // 公开接口(无需认证) .requestMatchers("/public/**").permitAll() // 需要指定角色的接口(Keycloak中给用户分配的Role) .requestMatchers("/admin/**").hasRole("ADMIN") // 其他所有接口需要认证 .anyRequest().authenticated() .and() // 启用Bearer Token认证(API接口常用) .oauth2ResourceServer() .jwt(); } }
4. 编写测试接口

创建TestController.java,验证认证效果:

java

运行

import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 测试接口 */ @RestController @RequestMapping public class TestController { // 公开接口(无需认证) @GetMapping("/public/hello") public String publicHello() { return "Hello, Public!"; } // 需认证的接口(任意登录用户) @GetMapping("/private/hello") public String privateHello(Authentication authentication) { // 获取当前登录用户信息 String username = authentication.getName(); return "Hello, " + username + "! (Private)"; } // 需ADMIN角色的接口 @GetMapping("/admin/hello") public String adminHello(Authentication authentication) { String username = authentication.getName(); return "Hello, " + username + "! (Admin)"; } }
5. 编写 Keycloak 配置 Bean(可选,Spring Boot 3.x 需补充)

创建KeycloakConfig.java,确保 Keycloak 配置生效:

java

运行

import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Keycloak配置解析器 */ @Configuration public class KeycloakConfig { // 启用Spring Boot配置文件中的Keycloak配置 @Bean public KeycloakSpringBootConfigResolver keycloakConfigResolver() { return new KeycloakSpringBootConfigResolver(); } }

三、测试验证

1. 获取 Keycloak 的 Access Token

通过 Keycloak 的 Token 接口获取测试用户的 Token(Postman/curl 均可):

bash

运行

# curl命令获取Token curl -X POST \ http://localhost:8080/realms/my-realm/protocol/openid-connect/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=test-user" \ -d "password=<test-user的密码>" \ -d "grant_type=password" \ -d "client_id=my-spring-app" \ -d "client_secret=<你的Client Secret>"

返回结果中会包含access_token(JWT 格式),复制该值。

2. 测试接口访问
  • 公开接口:直接访问http://localhost:8081/public/hello,返回Hello, Public!(无需 Token)。
  • 私有接口:在请求头中添加Authorization: Bearer <access_token>,访问http://localhost:8081/private/hello,返回当前用户名。
  • Admin 接口:如果测试用户没有 ADMIN 角色,访问http://localhost:8081/admin/hello会返回 403 Forbidden;给用户分配 ADMIN 角色后,即可正常访问。

四、核心原理说明

  1. 认证流程

    • 客户端(前端 / Postman)向 Keycloak 请求 Token → Keycloak 验证用户身份后返回 JWT 格式的 Access Token。
    • 客户端携带 Token 调用 Spring Boot 接口 → Spring Security 通过 Keycloak 适配器验证 Token 的合法性(签名、有效期、Realm/Client 匹配)。
    • 验证通过后,解析 Token 中的用户信息和角色,根据配置的访问规则判断是否允许访问接口。
  2. 关键注意点

    • Token 格式:Keycloak 默认返回 JWT 格式的 Token,Spring Security 通过 JWT 解析验证。
    • 角色映射:Keycloak 的 Role 名称默认不带ROLE_,Spring Security 需要通过SimpleAuthorityMapper补充前缀(或修改 Keycloak 配置)。
    • 环境适配:生产环境中,Keycloak 的auth-server-url需配置为公网可访问的地址,且建议开启 HTTPS。

总结

  1. 核心依赖:Spring Boot 集成 Keycloak 需引入keycloak-spring-boot-starterspring-boot-starter-security
  2. 配置核心:在application.yml中填写 Keycloak 的服务地址、Client ID/Secret、Realm 等信息。
  3. 认证规则:通过 Spring Security 配置类定义接口的访问权限(公开 / 需认证 / 需指定角色)。
  4. 测试方式:先从 Keycloak 获取 Access Token,再携带 Token 调用接口验证认证效果。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 21:22:27

Open-AutoGLM远程调试性能瓶颈突破,3大关键技术让你领先同行

第一章&#xff1a;Open-AutoGLM远程调试性能瓶颈突破&#xff0c;3大关键技术让你领先同行在大规模语言模型的远程调试场景中&#xff0c;Open-AutoGLM 面临着高延迟、低吞吐和资源争用等典型性能瓶颈。通过引入三项核心技术&#xff0c;开发者可显著提升调试效率并降低系统开…

作者头像 李华
网站建设 2026/6/13 11:13:01

南信大LaTeX论文排版终极指南:3小时从零到完美毕业设计

还在为毕业论文格式烦恼吗&#xff1f;南信大学子专属的LaTeX模板让你彻底告别格式焦虑&#xff01;这个专为南京信息工程大学设计的模板&#xff0c;能自动生成符合学校最新规范的论文格式&#xff0c;让你专注内容创作而非排版细节。 【免费下载链接】NUIST_Bachelor_Thesis_…

作者头像 李华
网站建设 2026/6/21 1:42:18

Wav2Lip384面部合成:为什么颜色失真与形变问题频发?

Wav2Lip384面部合成&#xff1a;为什么颜色失真与形变问题频发&#xff1f; 【免费下载链接】metahuman-stream 项目地址: https://gitcode.com/GitHub_Trending/me/metahuman-stream 在metahuman-stream项目中&#xff0c;Wav2Lip384模型作为音频驱动面部动画的核心组…

作者头像 李华
网站建设 2026/6/14 7:29:00

Notepadqq:Linux平台上免费的终极代码编辑器完整指南

Notepadqq&#xff1a;Linux平台上免费的终极代码编辑器完整指南 【免费下载链接】notepadqq A simple, general-purpose editor for Linux 项目地址: https://gitcode.com/gh_mirrors/no/notepadqq 在Linux生态系统中寻找一款功能强大且易于使用的代码编辑器&#xff1…

作者头像 李华
网站建设 2026/6/21 17:33:44

AlphaPi嵌入式开发板终极指南:从零开始玩转物联网项目

AlphaPi嵌入式开发板终极指南&#xff1a;从零开始玩转物联网项目 【免费下载链接】AlphaPi 项目地址: https://gitcode.com/gh_mirrors/al/AlphaPi AlphaPi是一款专为物联网和硬件编程爱好者设计的嵌入式开发板&#xff0c;集成了LED矩阵显示、三轴加速度计、物理按键…

作者头像 李华
网站建设 2026/6/16 22:49:34

从零开始部署Open-AutoGLM:适合小白的保姆级图文教程

第一章&#xff1a;Open-AutoGLM简介与部署准备Open-AutoGLM 是一个开源的自动化通用语言模型&#xff08;GLM&#xff09;部署框架&#xff0c;旨在简化大语言模型在本地或私有云环境中的部署流程。它集成了模型加载、推理优化、API 服务封装等功能&#xff0c;支持多种硬件平…

作者头像 李华