我是Spring Security和Spring Authorization Server的新手。我想定制JWT访问令牌,以在生成的令牌中包含userId的附加参数。我使用的是spring-authorization-server 1.0.0,OAuth2 TokenEndpointFilter是final class,因此无法覆盖它。有人能指导我需要配置哪个类或如何配置吗?
f87krz0w1#
看看参考资料中的OAuth2TokenCustomizer。它允许在构建JWT之前访问JWT的声明,因此您可以根据需要进行自定义。请注意,如果您想要自定义特定的令牌,则会向此组件传递context.getTokenType(),因此您可以添加if语句来仅自定义access_token。请参阅操作方法:为示例定制UserInfo端点(该示例定制id_token)。
OAuth2TokenCustomizer
context.getTokenType()
access_token
id_token
更新:
为了添加一个动态值(比如userId),显然需要获取要添加的值。您可以访问与授权关联的Principal来执行此操作,如以下示例所示:
userId
Principal
@Bean public OAuth2TokenCustomizer<JwtEncodingContext> tokenCustomizer() { return (context) -> { if (OAuth2TokenType.ACCESS_TOKEN.equals(context.getTokenType())) { UsernamePasswordAuthenticationToken authentication = context.getPrincipal(); User user = (User) authentication.getPrincipal(); context.getClaims().claim("userId", ((CustomUser) user).getId()); } }; }
这里假设您使用id创建了CustomUser。如果您需要查找一个值,它与任何其他Spring应用程序没有什么不同。您应该注入执行查找所需的bean:
id
CustomUser
@Bean public OAuth2TokenCustomizer<JwtEncodingContext> tokenCustomizer(CustomRepository repo) { return (context) -> { // ... }; }
如何使用注入的bean由您自己决定。context上还有其他方法,如context.getAuthorization()(返回OAuth2Authorization),可以根据需要获取有关当前授权的更多上下文。
context
context.getAuthorization()
OAuth2Authorization
1条答案
按热度按时间f87krz0w1#
看看参考资料中的
OAuth2TokenCustomizer
。它允许在构建JWT之前访问JWT的声明,因此您可以根据需要进行自定义。请注意,如果您想要自定义特定的令牌,则会向此组件传递
context.getTokenType()
,因此您可以添加if语句来仅自定义access_token
。请参阅操作方法:为示例定制UserInfo端点(该示例定制id_token
)。更新:
为了添加一个动态值(比如
userId
),显然需要获取要添加的值。您可以访问与授权关联的Principal
来执行此操作,如以下示例所示:这里假设您使用
id
创建了CustomUser
。如果您需要查找一个值,它与任何其他Spring应用程序没有什么不同。您应该注入执行查找所需的bean:
如何使用注入的bean由您自己决定。
context
上还有其他方法,如context.getAuthorization()
(返回OAuth2Authorization
),可以根据需要获取有关当前授权的更多上下文。