如何在Cognito发出的id_token中添加“组”自定义声明?

时间:2019-05-03 14:18:52

标签: spring-security amazon-cognito spring-security-oauth2 openid-connect

我想在开放ID连接id_token上使用自定义声明,以指示用户所属的组。

我已经与Okta和Spring Security 5一起工作了。有了Okta,有一种简单的方法来设置自定义声明并将其与用户的组关联。

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

如何结合使用Cognito和Spring Securities组/角色授权?

我具有与Spring Security 5,Webflux和Cognito一起使用的开放ID连接登录,但是现在我想添加一些基于角色的,组成员身份的粗粒度权限。

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

谢谢

2 个答案:

答案 0 :(得分:1)

只想在此处添加一个实现示例。

我使用我的自定义 JwtAuthenticationConverter 提取cognito:group并将其绑定到Spring Security Authority。

堆栈与您的堆栈相同(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();
}

还应提及的一点是,应在SecurityConfiguration类上方放置 @EnableReactiveMethodSecurity 批注,以在整个应用程序中启用@PreAuthorize批注的功能。

答案 1 :(得分:0)

我创建了另一个用户池,并确认向Cognito用户池添加名称为'groups'的可变属性的自定义属性是可变的,导致从openid作用域调用返回的{_1}返回了id_token }自定义声明,包含表示用户分配到的组的字符串。如果未将用户分配到任何组,则声明不会出现在令牌上。我怀疑这就是为什么我认为它最初不会起作用的原因。我找不到任何明确的文档来说明这个想法。希望这可以帮助某人,欢呼。