资讯动态

Java框架快速入门: Spring Security+OAuth2之Keycloak统一认证授权平台

发布时间:2026/9/16 8:19:09 来源:尧图企业网站定制
纲要核心概念解析Realm租户/安全域Client客户端User与RoleIdentity Provider与用户联合Keycloak 与 Spring Authorization Server 定位对比使用 Docker Compose 快速启动 Keycloak管理控制台初探Spring Boot 集成 Keycloak OAuth2 登录依赖与配置安全配置类总结Keycloak 是什么Keycloak 是一个由 Red Hat 开发的开源身份认证与访问管理IAM产品在 Java 生态中已经成为事实上的标准化方案。它不只是一个授权服务器而是一套“开箱即用”的安全产品提供了完整的 Web 管理界面支持多租户、社交登录、LDAP/Active Directory 联合、暴力破解防护等企业级特性。与 Spring 生态的spring-security-oauth2-authorization-server相比Keycloak 的重心在于提供一款独立运行的安全产品而 Spring Authorization Server 更偏向于一个快速集成的工具库让开发者能迅速在 Spring 应用中搭建定制化的授权逻辑。如果你的业务复杂度较高且对安全深度有较高要求直接采用成熟的 Keycloak 会是更稳妥的选择。核心概念速览Keycloak 的几个核心概念可以用下图表示包含拥有拥有定义1111****RealmString namecreateClient()manageUsers()ClientString clientIdString secretSetString redirectUrisSetRole rolesUserString usernameString emailCredential credentialRoleString nameRealm域可以理解为租户Tenant一个 Realm 拥有完全隔离的用户、角色、客户端等配置。默认的masterRealm 用于管理其他 Realm。在多租户云服务中不同企业的用户即使邮箱相同也属于不同 Realm彼此独立。Client客户端需要访问 Keycloak 进行认证或授权的应用。每个 Client 可以配置独立的密钥、重定向 URI、角色以及 Scope如 offline token。User RoleKeycloak 内置了完整的用户体系和角色支持用户级角色与客户端级角色并且可以划分用户组Group适合部门级权限管理。用户联合Keycloak 支持与其他身份源LDAP、Kerberos、自定义 Identity Provider 等集成实现无缝的用户认证同步。安全防护内置暴力破解检测、密码策略、会话管理等无需额外编码。Keycloak vs Spring Authorization Server对比维度KeycloakSpring Authorization Server定位独立、完整的 IAM 产品可快速集成的授权工具库管理界面丰富的 Web UI无需自行开发多租户原生支持 Realm 隔离需要自行扩展用户/角色管理内置支持组与角色层级需结合 Spring Security 手动构建身份联合内置 LDAP、OIDC、SAML 等需要额外适配器安全策略开箱即用细粒度可配需要手动实现与 Spring 集成提供适配器但本质是外部服务原生集成深度绑定 Spring 生态快速启动Docker Compose以下是启动 Keycloak 的docker-compose.yml示例依赖 MySQL 作为存储version:3.8services:mysql:image:mysql:8.0container_name:keycloak-mysqlenvironment:MYSQL_ROOT_PASSWORD:rootpasswordMYSQL_DATABASE:keycloakMYSQL_USER:keycloakMYSQL_PASSWORD:keycloakpasswordports:-3306:3306volumes:-mysql_data:/var/lib/mysqlnetworks:-keycloak-netkeycloak:image:quay.io/keycloak/keycloak:23.0container_name:keycloakenvironment:KC_DB:mysqlKC_DB_URL:jdbc:mysql://mysql:3306/keycloak?useSSLfalsecharacterEncodingUTF-8KC_DB_USERNAME:keycloakKC_DB_PASSWORD:keycloakpasswordKEYCLOAK_ADMIN:adminKEYCLOAK_ADMIN_PASSWORD:adminports:-8080:8080command:-start-devdepends_on:-mysqlnetworks:-keycloak-netvolumes:mysql_data:networks:keycloak-net:driver:bridge将以上文件保存后在终端执行docker-composeup-d等待启动完成后访问http://localhost:8080点击“Administration Console”并使用admin/admin登录即可进入管理界面。管理控制台初体验登录后会默认进入masterRealm在这里可以创建新的 Realm。创建用户进入目标 Realm例如默认的master或新建的myrealm。点击左侧菜单Users→Add user输入用户名如testuser并保存。切换到Credentials标签设置密码并关闭Temporary选项否则首次登录强制改密。保存。多租户登录特性由于 Realm 隔离登录时需要在登录页面确认所属 Realm。例如访问 Keycloak 账户控制台时若使用默认 Realm 为master则直接输入testuser和密码若为用户所在 Realm 为myrealm则需在 URL 或登录界面切换 Realm。Keycloak 默认强制首次登录后修改密码若密码标记为临时这是其内置安全策略的一部分。Spring Boot 集成 Keycloak OAuth2 登录下面演示如何将一个 Spring Boot 应用作为 OAuth2 客户端对接 Keycloak 实现用户登录认证。依赖在pom.xml中加入以下 starterSpring Boot 2.7 或 3.x 均可使用spring-boot-starter-oauth2-clientdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-oauth2-client/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency配置文件在application.yml中配置 Keycloak 作为 OAuth2 Providerspring:security:oauth2:client:registration:keycloak:client-id:demo-clientclient-secret:your-client-secretauthorization-grant-type:authorization_coderedirect-uri:{baseUrl}/login/oauth2/code/{registrationId}scope:openid,profile,emailprovider:keycloak:issuer-uri:http://localhost:8080/realms/myrealmserver:port:9090需要在 Keycloak 控制台中为 Realmmyrealm创建一个 Clientclient-id设置为demo-client访问类型Access Type选择confidential并填写有效的redirect-uri本例为http://localhost:9090/login/oauth2/code/keycloak。将生成的 secret 填入配置。安全配置类创建一个可直接运行的 Security 配置将所有请求拦截并导向 OAuth2 登录packagecom.example.demo.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.config.annotation.web.configuration.EnableWebSecurity;importorg.springframework.security.web.SecurityFilterChain;importstaticorg.springframework.security.config.Customizer.withDefaults;ConfigurationEnableWebSecuritypublicclassSecurityConfig{BeanpublicSecurityFilterChainfilterChain(HttpSecurityhttp)throwsException{http.authorizeHttpRequests(authorize-authorize.anyRequest().authenticated()).oauth2Login(withDefaults());returnhttp.build();}}测试控制器添加一个简单的 REST 端点验证登录状态packagecom.example.demo.controller;importorg.springframework.security.core.annotation.AuthenticationPrincipal;importorg.springframework.security.oauth2.core.user.OAuth2User;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.Collections;importjava.util.Map;RestControllerpublicclassUserController{GetMapping(/user)publicMapString,Objectuser(AuthenticationPrincipalOAuth2Userprincipal){returnCollections.singletonMap(name,principal.getAttribute(name));}}启动应用后访问http://localhost:9090/user会被重定向至 Keycloak 登录页面输入之前创建的用户如testuser/ 密码后成功返回用户姓名。上述代码完整、可运行展示了最精简的 OAuth2 客户端集成方式。你可以基于此继续扩展角色映射、资源服务器保护等高级功能。进阶方向自定义主题Keycloak 支持通过主题Theme定制登录界面可替换为符合企业风格的 UI。REST API 管理Keycloak 提供完整的 Admin REST API可以用来自动化创建用户、重置密码等实现与现有业务系统的无缝衔接。与 Spring Cloud 微服务结合通过 Spring Cloud Gateway Keycloak 可实现统一的网关鉴权与单点登录。Keycloak 高可用部署结合 Infinispan 缓存与外部数据库配置集群模式以支撑生产流量。总结Keycloak 作为一款成熟的 IAM 产品能显著降低自建认证授权系统的复杂度与安全风险。通过 Docker 快速部署并结合 Spring Security 的 OAuth2 客户端能力可以快速赋予应用企业级认证能力。对于从零开始的项目或需要统一身份管理的系统Keycloak 是值得优先考虑的选择。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价