Spring Boot Keycloak HTTP 401使用Sping Boot 服务创建新用户时未授权

xmq68pz9  于 2023-02-04  发布在  Spring
关注(0)|答案(3)|浏览(239)

获取javax.ws.rs未授权异常:HTTP 401尝试使用spring Boot 服务在keycloak中创建新用户时未经授权。
在KeycloakConfig类中,它在使用HTTP 401 Unauthorized创建keycloak示例期间中断。“消息”:“javax.ws.rs.未授权异常:HTTP 401未经授权",
我遗漏了什么吗?我在keycloak客户端或realm角色中没有任何额外的角色配置。
我想在KeycloakBuilder.builder中添加“.authorization(...)”,但我不确定要指定什么。

public static Keycloak getInstance(User user) {
        if (keycloak == null) {
            keycloak = KeycloakBuilder.builder()
                    .serverUrl("http://localhost:8080/auth")
                    .realm("myrealm")
                    .username(user.getUsername()).password(user.getPassword())
                    .grantType(OAuth2Constants.PASSWORD)
                    .clientId("myclient")
                    .clientSecret("0a53569564d2a748a0a5482699")
                    .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build()).build();
        }
        return keycloak;
    }

服务等级

UsersResource usersResource = KeycloakConfig.getInstance(user).realm("myrealm").users();
        CredentialRepresentation credentialRepresentation = createPasswordCredentials(user.getPassword());

        UserRepresentation kcUser = new UserRepresentation();
        kcUser.setUsername(user.getEmail());
        kcUser.setCredentials(Collections.singletonList(credentialRepresentation));
        kcUser.setFirstName(user.getFirstName());
        kcUser.setLastName(user.getLastName());
        kcUser.setEmail(user.getEmail());
        kcUser.setEnabled(true);
        kcUser.setEmailVerified(false);
        
        javax.ws.rs.core.Response response = usersResource.create(kcUser);
        System.out.println("kcUser: " + kcUser.toString());
        System.out.printf("Repsonse: %s %s%n", response.getStatus(), response.getStatusInfo());

在属性文件中

keycloak.realm=myrealm
keycloak.auth-server-url=http://localhost:8080/auth
keycloak.resource=myclient
keycloak.credentials.secret=0a5356444d26a748a0a5482699
keycloak.ssl-required= external
keycloak.use-resource-role-mappings= true
keycloak.bearer-only=true
keycloak.principal-attribute=preferred_username
c3frrgcw

c3frrgcw1#

由于缺少导入,我假设KeycloakBuilder来自包org.keycloak.admin.client.KeycloakBuilder
根据您提供的代码示例,您正尝试使用您要创建的用户示例化Keycloak示例。该用户缺少创建新用户的权限。
也就是说,您需要使用具有管理员权限/角色的用户创建Keycloak示例。至少“* 管理用户、查看客户端、查看领域、查看用户 *”

keycloak = KeycloakBuilder.builder()
            .serverUrl(KEYCLOAK_SERVER_URL)
            .realm("master")
            .clientId("admin-cli")
            .username("admin")
            .password("admin")
            .build();

使用管理员访问权限,您可以为多个领域创建用户。

// Create a new user
    final UserRepresentation newUser = new UserRepresentation();
    
    newUser.setUsername("username");
    newUser.setFirstName("fristname");
    newUser.setLastName("lastname");
    newUser.setEmail("username@example.com");
    newUser.setEnabled(true);

    // Now you need to get the realm you want the user to add to and the user ressource
    final UserResource realm = keycloak.realm("nameOfTheRealm").users();
    
   // Create the user for the realm
   final Response createUserResponse = userRessource.create(newUser);

 // check response if everything worked as expected
omqzjyyz

omqzjyyz2#

确保在“myrealm”下创建管理员帐户。不能使用默认管理员帐户(主领域)为“myrealm”创建用户

tcomlyy6

tcomlyy63#

为了使用户有权操作和调用Keycloak的API,您必须为该用户设置客户端角色
步骤1:用户应该在客户端"myrealm"中创建一个管理员,如"admin"密码"abc123"
第二步:移动到Roles mapping页签后,点击adminuser,为adminuser分配一些必要的权限,如下所示

步骤3:将.用户名(user. getUsername()).密码(user. getPassword())中的密码替换为"abc123"
希望能帮到你!

相关问题