Spring Security中Keycloak返回的token如何转换为Authentication对象?
Token转换为Authentication对象的完整流程
整个转换、校验、存入SecurityContext的逻辑,由keycloak-spring-security-adapter自动注入到Spring Security过滤器链的KeycloakAuthenticationProcessingFilter完成,它的执行顺序早于你提到的KeycloakAuthenticationFilter,具体步骤如下:
- 请求Token提取:过滤器首先从请求的
Authorization请求头提取Bearer格式的JWT,若配置了其他Token传递方式(比如请求参数、Cookie)也会对应读取,拿到原始JWT字符串。 - 构造待认证凭证:用提取到的JWT字符串生成未认证状态的
KeycloakAuthenticationToken实例,此时该实例仅存储Token原始值,无用户身份、权限信息,isAuthenticated()返回false。 - 身份校验与信息封装:将待认证的Token实例传入
AuthenticationManager,由匹配的KeycloakAuthenticationProvider完成实际校验:- 先验证JWT的签名有效性、过期时间、签发方(iss)、受众(aud)是否符合配置,确认Token为合法的Keycloak签发凭证
- 解析JWT的Payload字段,提取用户ID、用户名、所属角色、自定义声明等身份信息
- 生成认证通过的
KeycloakAuthenticationToken实例,此时实例的isAuthenticated()返回true,同时绑定用户身份、权限集合等完整信息
- 存入SecurityContext:拿到校验通过的Authentication对象后,过滤器会调用
SecurityContextHolder.getContext().setAuthentication(authentication)方法,将身份对象存入当前请求的安全上下文,后续所有过滤器、业务接口都可以直接从SecurityContext中读取已认证的身份信息。
小提示:如果你使用的是Spring Security 5+ 原生的OAuth2资源服务器能力(而非官方已停止维护的独立
keycloak-spring-security-adapter),对应的处理逻辑由BearerTokenAuthenticationFilter和JwtAuthenticationProvider完成,核心流程基本一致。
内容的提问来源于stack exchange,提问作者rainbowecho
相关产品推荐
相关产品推荐

