在 Spring 应用程序中通过管理 REST API 将用户添加到链接到 PostgreSQL 容器的 Keycloak 容器时遇到问题

问题描述 投票:0回答:1

我正在使用 Spring Boot 开发一个电子商务 Web 应用程序,Keycloak 负责用户注册、身份验证和授权。 Keycloak 连接到 PostgreSQL 容器以进行数据存储。问题出现在用户注册期间,该过程看似完成且没有错误,但未添加用户。我已经多次验证了凭据,但它们似乎不是原因。此外,我尝试了不同的授权类型,包括 OAuth2Constants.PASSWORD 和客户端凭据,但没有成功。奇怪的是,当我直接通过 Keycloak 管理控制台创建用户时,它工作正常,并且用户在数据库中可见。但是,当尝试通过应用程序注册用户时,该用户在 Keycloak 用户部分或数据库中不可见。我该如何排查并解决这个问题?

这是我正在使用的KeycloakConfig:

@Configuration
@KeycloakConfiguration
public class KeycloakConfig {

    private static Keycloak keycloak = null;

    @Value("${keycloak.auth-server-url}")
    private String authServerUrl;

    @Value("${keycloak.realm}")
    private String realm;

    @Value("${keycloak.resource}")
    private String clientId;

    @Value("${keycloak.credentials.secret}")
    private String clientSecret;



    public Keycloak getInstance() {
        if (keycloak == null) {
            keycloak = KeycloakBuilder.builder()
                    .serverUrl(authServerUrl)
                    .realm(realm)
                    .clientId(clientId)
                    .clientSecret(clientSecret)
                    .username("[email protected]")
                    .password("123")
                    .grantType(OAuth2Constants.PASSWORD)
                    .build();
        }
        return keycloak;
    }
}

这是负责用户创建的方法:

@Transactional
    public void createUser(UserDTO userDTO) {
        try{
            CredentialRepresentation credential = Credentials
                    .createPasswordCredentials(userDTO.password());
            UserRepresentation user = new UserRepresentation();
            user.setFirstName(userDTO.firstName());
            user.setUsername(userDTO.email());
            user.setLastName(userDTO.lastName());
            user.setEmail(userDTO.email());
            user.setCredentials(Collections.singletonList(credential));
            user.setEnabled(true);
            user.setEmailVerified(true);

            UsersResource instance = keycloakConfig.getInstance().realm(realm).users();
            instance.create(user);
            System.out.println("CREATED USER");
        }
        catch (Exception e) {
            e.printStackTrace(); // Log or handle the exception appropriately
            throw new RuntimeException("USER CREATION FAILED");
        }

    }

最后它只打印“CREATED USER”

java spring-boot keycloak registration
1个回答
0
投票

我没有重现,但有一些问题问你,也许有帮助:

  1. [电子邮件受保护]”是您在 keycloak Web 管理控制台中注册用户时使用的同一用户吗?如果没有,您确定该用户有适当的权限吗?

  2. 你确定领域是正确的吗?也许您正在创建用户,但处于与您预期不同的领域。

我以前用这个要点在 keycloak 中创建用户。它有点旧,但可能仍然有效:https://gist.github.com/thomasdarimont/0c136d0b8d339b997928e9bef225f941

© www.soinside.com 2019 - 2024. All rights reserved.