繁体   English   中英

AWS-Cognito:如何在用户池中分配用户角色?

[英]AWS-Cognito: How to assign user roles in the user pool?

我有一个用户管理系统,我在其中使用 AWS-Cognito userPool 进行注册/登录过程。我需要为这些用户分配角色。
例如:超级管理员、推荐等。

超级管理员角色负责添加/删除/编辑用户。 有没有办法仅通过使用 userPool 功能来做到这一点? 此外,是否可以通过 AWS 控制台而不是通过 API 分配角色?

超级管理员角色负责添加/删除/编辑用户。 有没有办法仅通过使用 userPool 功能来做到这一点?

您可以将 IAM 角色分配给组 例如,如果您创建一个superadminrole您分配到superadmingroup组,那么超级管理员根据具有相应的操作动作亚马逊Cognito用户池,如cognito-idp:AdminCreateUsercognito-idp:AdminDeleteUsercognito-idp:AdminAddUserToGroup , cognito-idp:ListUsers , cognito-idp:ListUsersInGroup等,然后登录的超级管理员就可以执行对应的用户任务了。 另请阅读开发人员和管理员可以执行以下任务的列表,以了解哪些操作可用。


此外,是否可以通过 AWS 控制台而不是通过 API 分配角色?

是的,从 AWS Cognito 开发人员指南(重点是我的)中查看用户属性部分复制:

从 AWS 管理控制台的 Amazon Cognito 主页中,选择管理您的用户身份

您的用户池页面中选择您的用户池。

选择用户和组以查看用户信息。

选择用户名以显示有关单个用户的更多信息。 在此屏幕中,您可以执行以下任何操作:

  1. 将用户添加到组
  2. 重置用户密码
  3. 确认用户
  4. 启用或禁用 MFA
  5. 删除用户

AWS Cognito 支持基于角色的访问控制,这可能是您的用例。

请参阅: https : //docs.aws.amazon.com/cognito/latest/developerguide/role-based-access-control.html

我刚刚在 Spring Boot 项目中遇到了这个问题,但没有找到最新的答案。 我遇到的一切都是针对 Spring Security 5.4 之前的版本。 所以我想我会把它放在那里来帮助任何正在寻找答案的人。

Cognito 中的角色似乎以 IAM 访问为导向。 为了在我的应用程序中为用户设置角色,我在用户和组部分添加了组来处理角色等元数据。

所以,我有像“ROLE:ADMIN”、“ROLE:PREMIUM”等组。

然后我在我的 spring boot 应用程序中设置了一个 OAuth2 登录安全配置。 将这些依赖项放在您的 maven 文件中:

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-jose</artifactId>
    </dependency>

您将需要这些属性:

app.url=http://localhost:8080
cognito.region=<aws region>
cognito.poolId=<your pool id>
cognito.poolName=<your pool name>
cognito.rooturl=https://${cognito.poolName}.auth.${cognito.region}.amazoncognito.com
spring.security.oauth2.client.registration.cognito.provider=cognito
spring.security.oauth2.client.registration.cognito.client-id=<your client id>
spring.security.oauth2.client.registration.cognito.client-secret=<your client secret>
spring.security.oauth2.client.registration.cognito.client-name=${cognito.poolName}
spring.security.oauth2.client.registration.cognito.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.cognito.scope=email,openid
spring.security.oauth2.client.registration.cognito.redirect-uri=${app.url}/login/oauth2/code/cognito

spring.security.oauth2.client.provider.cognito.authorizationUri=${cognito.rooturl}/oauth2/authorize
spring.security.oauth2.client.provider.cognito.tokenUri=${cognito.rooturl}/oauth2/token
spring.security.oauth2.client.provider.cognito.jwkSetUri=https://cognito-idp.${cognito.region}.amazonaws.com/${cognito.poolId}/.well-known/jwks.json
spring.security.oauth2.client.provider.cognito.user-info-uri=${cognito.rooturl}/oauth2/userInfo
spring.security.oauth2.client.provider.cognito.userNameAttribute=username

这将使您登录,并且您的令牌将在其声明中包含一个“cognito:groups”列表。 要将其取出并放入权限中,您需要创建 OAuth2UserService<OidcUserRequest, OidcUser> 的实现,如下所示:

public class CognitoOIDCUserService implements OAuth2UserService<OidcUserRequest, OidcUser> {

    private static final String ROLE_PREFIX = "ROLE:";

    @Override
    public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2AuthenticationException {
        Map<String, Object> parameters = userRequest.getIdToken().getClaims();
        List<String> groups = (List<String>) parameters.get("cognito:groups");
        List<GrantedAuthority> authorities =
                groups.stream().filter(group -> group.startsWith(ROLE_PREFIX))
                        .map(group -> group.substring(ROLE_PREFIX.length()))
                        .map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                        .collect(Collectors.toList());

        return new DefaultOidcUser(authorities, userRequest.getIdToken(), "cognito:username");
    }
}

然后将其添加到您的安全配置中:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private CognitoAuthenticationSuccessHandler successHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf()
                .and()
                .authorizeRequests(authz -> authz.mvcMatchers("/")
                        .permitAll()
                        .anyRequest()
                        .authenticated())
                .oauth2Login()
                .userInfoEndpoint(userInfo -> userInfo.oidcUserService(new CognitoOIDCUserService()))
                .successHandler(successHandler)
                .and()
                .logout()
                .logoutSuccessUrl("/");
    }
}

然后你就会拥有它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM