我正在使用 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”
我没有重现,但有一些问题问你,也许有帮助:
“[电子邮件受保护]”是您在 keycloak Web 管理控制台中注册用户时使用的同一用户吗?如果没有,您确定该用户有适当的权限吗?
你确定领域是正确的吗?也许您正在创建用户,但处于与您预期不同的领域。
我以前用这个要点在 keycloak 中创建用户。它有点旧,但可能仍然有效:https://gist.github.com/thomasdarimont/0c136d0b8d339b997928e9bef225f941