Сопоставление роли клиента из внешнего источника в Keycloak

#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
    }
 

Я также обновил репозиторий. Вы можете увидеть весь исходный код там