我有一个用户管理系统,其中我使用AWS-Cognito userPool进行注册/登录过程。我需要为这些用户分配角色。
例如:超级管理员、推荐人等。
超级管理员角色负责添加/删除/编辑用户。有没有什么方法可以仅仅通过使用userPool特性来做到这一点?此外,是否可以通过AWS控制台而不是API来分配角色?
发布于 2019-05-20 03:26:44
超级管理员角色负责添加/删除/编辑用户。有没有什么方法可以仅仅通过使用userPool特性来做到这一点?
你可以使用assign IAM roles to groups。例如,如果您创建了一个分配给superadmingroup组的superadminrole,则超级管理员将根据该Actions for Amazon Cognito User Pools执行相应的操作,例如cognito-idp:AdminCreateUser、cognito-idp:AdminDeleteUser、cognito-idp:AdminAddUserToGroup、cognito-idp:ListUsers、cognito-idp:ListUsersInGroup等。然后,登录的超级管理员可以执行相应的用户任务。另请阅读Developers and administrators can perform the following tasks列表,以了解哪些操作可用。
此外,是否可以通过
控制台而不是通过应用程序接口来分配角色?
是的,从AWS Cognito开发人员指南中的Viewing User Attributes部分复制(我的重点)
从Amazon Cognito主页的AWS管理控制台中,选择Manage your user identities。
从Your user Pools页面选择您的用户池。
选择User and Groups以查看用户信息。
选择用户名以显示有关单个用户的详细信息。在此屏幕中,您可以执行以下任何操作:
发布于 2019-05-20 03:07:35
AWS Cognito支持基于角色的访问控制,这可能是您的用例。
请参阅:https://docs.aws.amazon.com/cognito/latest/developerguide/role-based-access-control.html
发布于 2021-04-27 05:40:58
我只是在Spring Boot项目中遇到了这个问题,没有找到最新的答案。我遇到的所有东西都是Spring Security 5.4之前的版本。所以我想我应该把这篇文章放在那里,以帮助其他正在寻找答案的人。
认知中的角色似乎是以IAM访问为导向的。为了在我的应用程序中为用户设置角色,我在users and groups部分中添加了组,以处理类似角色的元数据。
所以,我有像“角色:管理员”,“角色:高级”等组。
然后,我在我的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("/");
}
}然后你就能拥有它了。
https://stackoverflow.com/questions/56210916
复制相似问题