Spring Boot整合Keycloak如何实现分路径多客户端鉴权
多客户端分路径鉴权实现方案
不要依赖Keycloak Spring Boot Starter默认的单客户端自动配置,直接基于Spring Security多过滤链机制实现路径级别的客户端校验分流,操作步骤如下:
- 先清掉默认单客户端的自动配置
把application.properties里全局配置的keycloak.resource及相关单客户端校验参数删掉,在启动类上排除Keycloak默认自动装配类,避免默认配置强制全局走单客户端校验逻辑:@SpringBootApplication(exclude = KeycloakAutoConfiguration.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } - 自定义两个客户端的独立配置参数
在配置文件里用自定义前缀分别存储internal-client和frontend-client的连接参数,不要复用默认的keycloak配置前缀:
写两个独立的配置类读取上述参数,分别实例化对应客户端的JWT解码器、认证管理器:核心是每个解码器校验令牌时,会验证JWT的# 内部微服务客户端参数 custom.keycloak.internal.client-id=internal-client custom.keycloak.internal.client-secret=你的internal客户端对应密钥 custom.keycloak.internal.issuer=http://你的keycloak部署地址/realms/你的业务领域名 # 前端用户客户端参数 custom.keycloak.frontend.client-id=frontend-client custom.keycloak.frontend.client-secret=你的frontend客户端对应密钥 custom.keycloak.frontend.issuer=http://你的keycloak部署地址/realms/你的业务领域名aud(受众)字段是否匹配当前客户端ID,从根源上避免跨客户端的令牌混用。 - 配置两套优先级不同的安全过滤链
利用Spring Security支持多SecurityFilterChain的特性,按路径匹配规则绑定对应的认证逻辑:- 给
/internal/**路径配置最高优先级的过滤链,绑定internal-client对应的认证管理器,要求该路径下所有请求必须携带由internal-client签发的有效令牌,再按内部接口的要求配置权限规则 - 给剩余所有路径配置次优先级的过滤链,绑定frontend-client对应的认证管理器,要求普通接口的请求必须携带frontend-client签发的有效令牌,走普通终端用户的权限校验逻辑
注意必须给/internal/**的过滤链设置更高的匹配优先级,否则会被通用路径的过滤链提前拦截,导致鉴权逻辑不生效。
- 给
- 加一层兜底校验
在每个过滤链的校验逻辑里额外加一层判断:解析完JWT后二次确认令牌的受众字段确实对应当前链路的客户端ID,如果不匹配直接返回403,避免因为配置疏漏导致的越权访问。
如果项目用的是Spring Security 5.7以上版本,直接用框架原生的OAuth2 Resource Server模块实现JWT校验即可,不需要额外引入老版Keycloak Starter,配置多认证逻辑的方式更简洁,兼容性也更好。
内容的提问来源于stack exchange,提问作者FrancMo
相关产品推荐
相关产品推荐

