oauth2.0 自定义JWT令牌以在Spring authorization server 1.0.0中添加userId

rpppsulh  于 2023-05-21  发布在  Spring
关注(0)|答案(1)|浏览(267)

我是Spring Security和Spring Authorization Server的新手。我想定制JWT访问令牌,以在生成的令牌中包含userId的附加参数。
我使用的是spring-authorization-server 1.0.0,OAuth2 TokenEndpointFilter是final class,因此无法覆盖它。有人能指导我需要配置哪个类或如何配置吗?

f87krz0w

f87krz0w1#

看看参考资料中的OAuth2TokenCustomizer。它允许在构建JWT之前访问JWT的声明,因此您可以根据需要进行自定义。
请注意,如果您想要自定义特定的令牌,则会向此组件传递context.getTokenType(),因此您可以添加if语句来仅自定义access_token。请参阅操作方法:为示例定制UserInfo端点(该示例定制id_token)。

更新:

为了添加一个动态值(比如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:

@Bean
public OAuth2TokenCustomizer<JwtEncodingContext> tokenCustomizer(CustomRepository repo) {
    return (context) -> {
        // ...
    };
}

如何使用注入的bean由您自己决定。context上还有其他方法,如context.getAuthorization()(返回OAuth2Authorization),可以根据需要获取有关当前授权的更多上下文。

相关问题