如何通过 ID 获取其他用户信息(用户名、名字)? [钥匙斗篷]
How can I get other users info(username, firstname) by id? [Keycloak]
如何根据用户 ID 获取用户 keycloak 属性(用户名、名字、电子邮件...)?
我在 Keycloak 会话中使用的用户已经分配了 view-users 角色,所以我应该能够至少列出所有用户,是否有任何 Keycloak class我可以用吗?
我在这里试图实现的是避免将 keycloak 用户数据库复制到另一个本地数据库,但似乎无法访问任何其他用户信息,除了当前会话中的用户信息...
您可以使用管理 REST API。相关API的详细说明可用here。您也可以使用 JAVA 包装器 API。请在下面找到几个示例。
示例 1,REST:
获取访问令牌:
curl \
-d "client_id=admin-cli" \
-d "username=admin" \
-d "password=secret" \
-d "grant_type=password" \
"http://localhost:8080/auth/realms/master/protocol/openid-connect/token"
获取所有用户:
curl \
-H "Authorization: bearer eyJhbGciOiJSUzI...." \
"http://localhost:8080/auth/admin/realms/master/users"
示例输出:
[
{
"id":"349f67de-36e6-4552-ac54-e52085109616",
"username":"admin",
"enabled":true,
...
},
{
"id":"08afb701-fae5-40b4-8895-e387ba1902fb",
"username":"lbalev",
"enabled":true,
....
}
]
根据用户id获取用户:
curl \
-H "Authorization: bearer eyJhbGciOiJSU...." \
"http://localhost:8080/auth/admin/realms/master/users/349f67de-36e6-4552-ac54-e52085109616"
例2,JAVA API:
根据用户ID获取用户:
public class TestUserAccess {
private static final String SERVER_URL = "http://localhost:8080/auth";
private static final String REALM = "master";
private static final String USERNAME = "admin";
private static final String PASSWORD = "secret";
private static final String CLIENT_ID = "admin-cli";
public static void main(String[] args) {
Keycloak keycloak = KeycloakBuilder
.builder()
.serverUrl(SERVER_URL)
.realm(REALM)
.username(USERNAME)
.password(PASSWORD)
.clientId(CLIENT_ID)
.resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
.build();
UsersResource usersResource = keycloak.realm(REALM).users();
UserResource userResource = usersResource.get("08afb701-fae5-40b4-8895-e387ba1902fb");
System.out.println(userResource.toRepresentation().getEmail());
}
}
上面示例的相关依赖项是(请注意版本可能不是最新的):
dependencies {
compile group: 'org.keycloak', name: 'keycloak-admin-client', version: '3.3.0.CR2'
compile group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: '3.1.4.Final'
compile group: 'org.jboss.resteasy', name: 'resteasy-client', version: '3.1.4.Final'
compile group: 'org.jboss.resteasy', name: 'resteasy-jackson2-provider', version: '3.1.4.Final'
}
这也是一个简单的方法,因为在上面的回答中,所有的用户信息都被获取,这不是正确的方法,因为万一有成千上万的用户,这将是一个沉重的调用。
所以只需将用户名作为查询参数传递
GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser
确保您使用管理员访问令牌进行调用
感谢@Nikhil Shinde 分享 restapi 端点。
像他说的下面会给点赞的网友看看
GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser
如果您想要完全匹配的用户名,请尝试使用 exact=true
GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser&exact=true
来源:https://www.keycloak.org/docs-api/15.0/rest-api/index.html#_users_resource
如何根据用户 ID 获取用户 keycloak 属性(用户名、名字、电子邮件...)? 我在 Keycloak 会话中使用的用户已经分配了 view-users 角色,所以我应该能够至少列出所有用户,是否有任何 Keycloak class我可以用吗?
我在这里试图实现的是避免将 keycloak 用户数据库复制到另一个本地数据库,但似乎无法访问任何其他用户信息,除了当前会话中的用户信息...
您可以使用管理 REST API。相关API的详细说明可用here。您也可以使用 JAVA 包装器 API。请在下面找到几个示例。
示例 1,REST:
获取访问令牌:
curl \
-d "client_id=admin-cli" \
-d "username=admin" \
-d "password=secret" \
-d "grant_type=password" \
"http://localhost:8080/auth/realms/master/protocol/openid-connect/token"
获取所有用户:
curl \
-H "Authorization: bearer eyJhbGciOiJSUzI...." \
"http://localhost:8080/auth/admin/realms/master/users"
示例输出:
[
{
"id":"349f67de-36e6-4552-ac54-e52085109616",
"username":"admin",
"enabled":true,
...
},
{
"id":"08afb701-fae5-40b4-8895-e387ba1902fb",
"username":"lbalev",
"enabled":true,
....
}
]
根据用户id获取用户:
curl \
-H "Authorization: bearer eyJhbGciOiJSU...." \
"http://localhost:8080/auth/admin/realms/master/users/349f67de-36e6-4552-ac54-e52085109616"
例2,JAVA API:
根据用户ID获取用户:
public class TestUserAccess {
private static final String SERVER_URL = "http://localhost:8080/auth";
private static final String REALM = "master";
private static final String USERNAME = "admin";
private static final String PASSWORD = "secret";
private static final String CLIENT_ID = "admin-cli";
public static void main(String[] args) {
Keycloak keycloak = KeycloakBuilder
.builder()
.serverUrl(SERVER_URL)
.realm(REALM)
.username(USERNAME)
.password(PASSWORD)
.clientId(CLIENT_ID)
.resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
.build();
UsersResource usersResource = keycloak.realm(REALM).users();
UserResource userResource = usersResource.get("08afb701-fae5-40b4-8895-e387ba1902fb");
System.out.println(userResource.toRepresentation().getEmail());
}
}
上面示例的相关依赖项是(请注意版本可能不是最新的):
dependencies {
compile group: 'org.keycloak', name: 'keycloak-admin-client', version: '3.3.0.CR2'
compile group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: '3.1.4.Final'
compile group: 'org.jboss.resteasy', name: 'resteasy-client', version: '3.1.4.Final'
compile group: 'org.jboss.resteasy', name: 'resteasy-jackson2-provider', version: '3.1.4.Final'
}
这也是一个简单的方法,因为在上面的回答中,所有的用户信息都被获取,这不是正确的方法,因为万一有成千上万的用户,这将是一个沉重的调用。
所以只需将用户名作为查询参数传递
GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser
确保您使用管理员访问令牌进行调用
感谢@Nikhil Shinde 分享 restapi 端点。
像他说的下面会给点赞的网友看看
GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser
如果您想要完全匹配的用户名,请尝试使用 exact=true
GET: http://localhost:8080/auth/admin/realms/{real-name}/users?username=testUser&exact=true
来源:https://www.keycloak.org/docs-api/15.0/rest-api/index.html#_users_resource