我想在开放ID连接id_token上使用自定义声明,以指示用户所属的组。
我已经与Okta和Spring Security 5一起工作了。有了Okta,有一种简单的方法来设置自定义声明并将其与用户的组关联。
现在,我想对Cognito做同样的事情。
如何结合使用Cognito和Spring Securities组/角色授权?
我具有与Spring Security 5,Webflux和Cognito一起使用的开放ID连接登录,但是现在我想添加一些基于角色的,组成员身份的粗粒度权限。
我已在用户池中添加了一个自定义属性,但看不到如何填充它。
谢谢
答案 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 }自定义声明,包含表示用户分配到的组的字符串。如果未将用户分配到任何组,则声明不会出现在令牌上。我怀疑这就是为什么我认为它最初不会起作用的原因。我找不到任何明确的文档来说明这个想法。希望这可以帮助某人,欢呼。