Я извлек информацию о группах пользователей из конечной точки OIDC Keycloak, но они не поставляются с определенными мной АТРИБУТАМИ группы (см. вкладку «Атрибуты» в форме группы рядом с настройками). Есть ли претензия добавить к моему запросу?
Я использую клиент RESTeasy для доступа к API-интерфейсу администратора Keycloak (пока что результаты гораздо лучше, чем при использовании предоставленного клиента администратора):
@Path("/admin/realms/{realm}")
public interface KeycloakAdminService {
@GET
@Path("/users/{id}/groups")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
List<GroupRepresentation> getUserGroups(@PathParam("realm") String realm, @PathParam("id") String userId,
@HeaderParam(AUTHORIZATION) String accessToken);
//DEBUG the access token must always be prefixed by "Bearer "
}
Итак, я могу получить группы пользователей:
private void fetchUserGroups(UserInfoOIDC infos, String userId) {
log.info("Fetching user groups from {}...", getRealm());
try {
KeycloakAdminService proxy = kcTarget.proxy(KeycloakAdminService.class);
AccessTokenResponse response = authzClient.obtainAccessToken(getAdminUsername(), getAdminPassword());
List<GroupRepresentation> groups = proxy.getUserGroups(getRealm(), userId,
"Bearer " + response.getToken());
infos.importUserGroups(groups); //DEBUG here we go!
} catch (WebApplicationException e) {
log.error("User groups failure on {}: {}", getRealm(), e.getMessage());
}
}
Но когда дело доходит до исследования данных, оказывается, что в структуре GroupRepresentation#getAttributes нет никаких атрибутов.
Я читал, что претензии могут быть добавлены к запросам информации о пользователе. Работает ли это на API администратора? Как я могу добиться такого результата с помощью шаблонов RESTeasy? Спасибо
Извините, французские каникулы... Я попробую и сообщу вам как можно скорее
Я смог добиться этого, добавив информацию о группах/ролях в свойство токена другие претензии:
Для этого в конфигурации keycloak перейдите в свой клиент -> сопоставители и добавьте сопоставитель групп/ролей. Например.
Теперь эта информация начнет поступать в ваш токен доступа:
Чтобы получить доступ к этому групповому атрибуту в Java, вы можете извлечь его из свойства otherclaims
токена доступа. Например.:
KeycloakSecurityContext keycloakSecurityContext = (KeycloakSecurityContext)(request.getAttribute(KeycloakSecurityContext.class.getName()));
AccesToken token = keycloakSecurityContext.getToken();
На изображении ниже вы можете видеть, что свойство otherclaims
токена заполнено атрибутом groups, который мы создали в keycloak. Обратите внимание, что если бы мы назвали «свойство требования токена» как groupXYZ, otherclaims
отображалось бы:
groupsXYZ=[Administrator]
Хорошо, я действительно мог бы получить все атрибуты групп в «другие утверждения», как вы сказали (на самом деле смешанные в одну запись «группы», но это не повредит для моего варианта использования) при запросе информации о пользователе API администратора (то есть в UserInfo, а не в AccessTokenResponse). Большое спасибо!
Мой плохой @tryingtolearn ... я получил НАЗВАНИЯ групп, НО мне нужны атрибуты моих групп!
Следует ли использовать группы для разрешений? Разве мы не должны использовать роли? Я не уверен в лучшем подходе к установке разрешений. Я новичок в keycloak; Надеюсь, это не глупый вопрос.
Все еще очень полезно почти три года спустя, спасибо!
Вот как я мог в конечном итоге сопоставить групповые атрибуты (унаследованные как пользовательские атрибуты, как предполагалось ранее) в информацию о пользователе, в раздел «другие утверждения»:
это сработало для вас? Атрибуты группы не могут быть сопоставлены с помощью картографа AFAIK...
Мне потребовалось время, чтобы понять этот ответ. Вы ссылаетесь на следующее: Пользователи, которые становятся членами группы, наследуют атрибуты, определенные этой группой.. Это означает, что вы действительно можете выполнить сопоставление атрибутов пользователей и получить атрибуты из их групп. Будьте осторожны, так как вы можете столкнуться с некоторыми конфликтами между именами групп, которые атрибуты пользователя
Я также прочитал это в документации Keycloak: «Группы управляют группами пользователей. Атрибуты могут быть определены для группы. Вы также можете сопоставить роли с группой. Пользователи, которые становятся членами группы, наследуют атрибуты и сопоставления ролей., которую определяет эта группа»; это значит, что я бы предпочел искать эти атрибуты непосредственно в информации о пользователе? Но они тоже не приходят, так что мой вопрос остается...