【问题标题】:AWS-Cognito: How to assign user roles in the user pool?AWS-Cognito:如何在用户池中分配用户角色?
【发布时间】:2019-10-06 05:34:39
【问题描述】:

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

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

【问题讨论】:

    标签: amazon-web-services aws-sdk amazon-cognito


    【解决方案1】:

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

    您可以assign IAM roles to groups。例如,如果您创建一个分配给superadmingroup 组的superadminrole,则超级管理员将根据Actions for Amazon Cognito User Pools 执行相应的操作,例如cognito-idp:AdminCreateUsercognito-idp:AdminDeleteUsercognito-idp:AdminAddUserToGroupcognito-idp:ListUserscognito-idp:ListUsersInGroup等。然后,登录的超级管理员可以执行相应的用户任务。另请阅读Developers and administrators can perform the following tasks 的列表以查看可用的操作。


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

    是的,复制自 AWS Cognito 开发人员指南中的 Viewing User Attributes 部分(强调我的)

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

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

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

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

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

    【讨论】:

    • @matsev .....非常感谢您提供的参考链接。所以我不能在不创建组的情况下为池中的单个用户分配角色?令人困惑的部分是,我是否必须使用身份池功能为 UserPool 中的用户授权和创建角色?我不确定我是否正确理解了 UserPool v/s 身份池的概念。
    【解决方案2】:

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

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

    【讨论】:

    • 这是用于身份池,与 OP 要求的用户池不同。
    【解决方案3】:

    我刚刚在 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 的实现,如下所示:

    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("/");
        }
    }
    

    然后你就会拥有它。

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2017-01-26
      • 2020-09-19
      • 2021-08-11
      • 2018-03-16
      • 2020-05-27
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      相关资源
      最近更新 更多