首页 > 解决方案 > 如何向 Cognito 发布的 id_token 添加“组”自定义声明?

问题描述

我想在打开的 id connect id_token 上使用自定义声明来指示用户所属的组。

我使用 Okta 和 Spring Security 5 进行了这项工作。使用 Okta 有一种简单的方法来设置自定义声明并将其与用户组相关联。

现在我想对 Cognito 做同样的事情。

如何将 Spring Securities 组/角色权限与 Cognito 结合使用?

我有使用 Spring Security 5、Webflux 和 Cognito 的开放 id connect 登录,但现在我想添加一些基于角色的、组成员身份的粗粒度权利。

我已向我的用户池添加了一个自定义属性,但看不到如何填充它。

谢谢

标签: spring-securityamazon-cognitospring-security-oauth2openid-connect

解决方案


只想在这里添加一个实现示例。

我使用我的自定义JwtAuthenticationConverter来提取 cognito:groups 并将它们绑定到 Spring Security Authorities。

Stack 和你的一样(Webflux,Spring 5 [boot])。这是转换器类:

@Component
public class GrantedAuthoritiesExtractor extends JwtAuthenticationConverter {

    @Override
    protected Collection<GrantedAuthority> extractAuthorities(Jwt jwt) {
        val authorities = (Collection<String>) jwt.getClaims().get("cognito:groups");

        if (authorities == null) {
            return emptyList();
        }

        return authorities.stream()
                          .map(SimpleGrantedAuthority::new)
                          .collect(toList());
    }
}

这是我的 SecurityConfiguration 中的相关部分:

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http,
                                                        GrantedAuthoritiesExtractor extractor) {
    http
        // ...
        // Other configurations
        // ...
        .oauth2ResourceServer()
        .jwt()
        .jwtAuthenticationConverter(new ReactiveJwtAuthenticationConverterAdapter(extractor));

    return http.build();
}

还有一点应该提到的是,@EnableReactiveMethodSecurity注释应该放在 SecurityConfiguration 类之上,以在整个应用程序中启用@PreAuthorize 注释的功能。


推荐阅读