#mapping #keycloak #roles
#сопоставление #keycloak #роли
Вопрос:
Я успешно реализован User storage SPI
в keycloak. Теперь я могу выполнять аутентификацию из внешнего источника REST. Теперь я хочу получить роли клиентов из внешнего источника. Я получаю объект user следующим образом:
{
"id": "78c8ee03-0bf8-422a-91ec-6241624c0683",
"username": "kaushikam",
.....
"roles": [
{
"id": 1,
"name": "heroes"
"client": "heroes-client"
}
]
}
На keycloak
сервере я вручную создал клиента с именем heroes-client
, и в этом клиенте я добавил роль клиента heroes
. Теперь я хочу сопоставить роль клиента, полученную из внешнего источника, с ролью клиента в названном heroes-client
клиенте.
Я использовал getClientRoleMappings
in UserModel
следующим образом:
override fun getClientRoleMappings(app: ClientModel?): MutableSet<RoleModel> {
logger.info { "Calling getClientRoleMappings" }
val userRoles = this.user?.roles?.filter { it.client == app?.name } ?: emptyList()
val clientRoles = mutableSetOf<RoleModel>()
userRoles.forEach {
if (app != null) {
clientRoles.add(app.getRole(it.name))
}
}
return clientRoles
}
Но приведенный выше код не вызывается. getRoleMappings
Вызывается While. Есть ли способ решить эту проблему.
Вы можете получить весь исходный код моей работы здесь
Ответ №1:
Я решил проблему. Я думаю, что в настоящее время нет необходимости getClientRoleMappings
в методе. Моя потребность может быть достигнута с помощью этого getRoleMappings
метода. Я думал, что этот метод используется только для realm roles
, но это не так. Ниже приведен обновленный код для getRoleMappings
:
override fun getRoleMappings(): MutableSet<RoleModel> {
val roles = addRealmRoles()
return addClientRoles(roles)
}
private fun addRealmRoles(): MutableSet<RoleModel> {
val roles = mutableSetOf<RoleModel>()
user?.roles?.forEach { roleDTO ->
if (realm != null) {
val realmRole = realm.getRole(roleDTO.name) ?: null
if (realmRole != null) {
roles.add(realmRole)
}
}
}
return roles
}
private fun addClientRoles(roles: MutableSet<RoleModel>): MutableSet<RoleModel> {
user?.roles?.forEach { roleDTO ->
realm?.clientsStream?.forEach { client ->
client.rolesStream.forEach { clientRole ->
if (client.clientId == roleDTO.client amp;amp; clientRole.name == roleDTO.name) {
roles.add(clientRole)
}
}
}
}
return roles
}
Я также обновил репозиторий. Вы можете увидеть весь исходный код там