【发布时间】:2018-12-12 00:11:22
【问题描述】:
我使用的示例 Java 代码:
public static AjaxResponse createUser(User newUser) {
Keycloak keycloak = Keycloak.getInstance(
SERVER_URL,
REALM,
USERNAME,
PASSWORD,
CLIENT_ID);
// Get Realm
RealmResource realmResource = keycloak.realm(REALM);
UsersResource userResource = realmResource.users();
// Create User Representation
UserRepresentation user = getUserRepresentation(newUser);
// Create user (requires manage-users role)
try {
System.out.println("Username: {}", userResource.get("USER-ID-HERE").toRepresentation().getUsername());
System.out.println("Count: " + userResource.count());
Response response = userResource.create(user);
System.out.println("Response: " + response.getStatusInfo());
System.out.println("Response: " + response.getStatus());
System.out.println("Response: " + response.getMetadata());
} catch (Exception e) {
System.out.println(ExceptionUtils.getStackTrace(e));
return new AjaxResponse("Fail", false);
}
return new AjaxResponse("Successful User Creation", true);
}
private static UserRepresentation getUserRepresentation(User newUser) {
UserRepresentation user = new UserRepresentation();
user.setEnabled(true);
user.setUsername(newUser.getUsername());
user.setFirstName(newUser.getFirstName());
user.setLastName(newUser.getLastName());
user.setEmail(newUser.getEmail());
CredentialRepresentation credentialRepresentation = new CredentialRepresentation();
credentialRepresentation.setTemporary(true);
credentialRepresentation.setType(CredentialRepresentation.PASSWORD);
credentialRepresentation.setValue(newUser.getUsername());
user.setCredentials(Collections.singletonList(credentialRepresentation));
}
我运行代码时得到的响应:
Username: USERNAME Correctly Identified here
Count: 98
Response: Conflict
Response: 409
Response: [Connection=keep-alive,Content-Length=46,Content-Type=application/json,Date=Tue, 03 Jul 2018 15:27:58 GMT,Server=WildFly/10,X-Powered-By=Undertow/1]`
一些想法: 我添加了计数,以确定整个连接是否有效。而且似乎返回的计数是正确的。所以我成功连接到 keycloak,但是当我尝试创建用户时出现其他问题。
我的 pom.xml 中的依赖项
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-servlet-filter-adapter</artifactId>
<version>3.2.1.Final</version>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-admin-client</artifactId>
<version>3.2.1.Final</version> (Have also tried 3.1.0.Final and 3.2.0.Final)
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.1.4.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>3.1.4.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.1.4.Final</version>
</dependency>
据我了解,这些依赖项也是相关的:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson-version}</version>
</dependency>
其他信息:
我使用的 Keycloak 版本:3.2.0
Keycloak API 可以在here找到
更多关于 HTTP 409 代码的信息可以在here找到
非常感谢任何帮助或指导。 注意 凭据和所有变量都已检查过一次、两次、三次和 10 次。我一直在寻找一个完整的工作示例。但是大多数都没有指定所需的依赖项,因此我的代码失败了。
注意:我也在使用 Tomcat-8,并且正在深入研究这个问题。我看到Tomcat8可能有一些特殊的配置。请注意,我的 Web 应用的身份验证登录注销已按预期工作。
【问题讨论】:
-
keycloak-admin-client 版本和您的服务器版本应该相同,当您尝试在同一领域创建具有相同名称的用户时会得到 409
-
正如我上面写的,我也尝试过其他版本,它不起作用。而且你描述的409问题已经检查了3次以上。
-
使用 Object entity = response.getEntity(); 检查是否收到任何错误消息;字符串错误消息 = ""; if (entity instanceof ErrorRepresentation) errorMessage = ((ErrorRepresentation) entity).getErrorMessage(); else if (entity != null) errorMessage = entity.toString();
-
感谢@ravthiru 的评论。刚刚尝试过,但仍然没有运气。
-
这是否意味着 Keycloak 没有错误消息
标签: java keycloak http-status-code-409