Вопрос или проблема
Я пытаюсь создать новые сферы с ролями, пользователями и другой конфигурацией, используя Java-клиент. Для этой цели я настроил сервисный аккаунт в сфере master
, используя OIDC и прикрепив к нему все роли сферы, которые я смог найти:
Затем я использую этот аккаунт для подключения к Keycloak через Java API из приложения Quarkus. Код пытается создать новую сферу, затем добавить роли, пользователей, клиентов и т. д. к ней.
На моей локальной конфигурации для разработки этот процесс полностью работает. Но я попытался воспроизвести его на сервере, и там клиент может создавать сферы, но попытка добавить роль (первый шаг после создания сферы) завершается неудачей с ошибкой доступа (HTTP 403).
Пока я попробовал:
- убедиться, что обе конфигурации используют одну и ту же версию Keycloak. Они обе используют Docker-образ
quay.io/keycloak/keycloak:25.0.6
. - проверить конфигурацию запуска на предмет того, что могло бы вызвать проблему. У удаленной конфигурации есть дополнительные настройки для использования производственной базы данных и работы за обратным прокси, но ничего из этого не кажется связанным.
- сравнить настройки клиента в моей локальной, работающей конфигурации с удаленной, неработающей, щелкая по всем экранам, которые казались релевантными. Я не заметил никакой разницы, кроме порядка ролей или подобных элементов, которые, как мне кажется, имеют заданную семантику.
- запустить Keycloak с включенным журналированием отладки и просмотреть логи. Я вижу, что он неудачно завершает выполнение в
org.keycloak.services.resources.admin.permissions.RolePermissions.requireManage(RolePermissions.java:370)
, но это, похоже, не сообщает мне ничего нового, и ничего другого в логах также не кажется релевантным (логов довольно много, так что я мог что-то пропустить). - сначала загрузить экспорты сферы
master
в обеих конфигурациях и несколько нормализовать их, смотря на различия (заменить UUID на жестко закодированную строку, удалить сферы, которые не общие, переупорядочить некоторые списки) – на данный момент я не нашел никаких различий, но нормализовать порядок довольно утомительно, поэтому я не сделал все и, возможно, допустил ошибки.
Одно отличие заключается в том, что моя локальная конфигурация не находится за обратным прокси, а на удаленной стороне доступ немного сложнее: публичный обратный прокси использует другое имя хоста (установлено как KC_HOSTNAME
), чем доступ к API, так как API не доступен публично. Программное обеспечение управления аккаунтами, которое я написал, использует сетевую мостовую сеть Docker, где экземпляр Keycloak просто известен под именем keycloak
. KC_HOSTNAME_STRICT
установлено в false
.
Вот полные параметры окружения для контейнера:
KEYCLOAK_ADMIN=...
KEYCLOAK_ADMIN_PASSWORD=...
KC_DB=postgres
KC_DB_URL=jdbc:postgresql://host.docker.internal:5432/keycloak
KC_DB_USERNAME=keycloak
KC_DB_PASSWORD=...
KC_HTTP_ENABLED=true
KC_PROXY_HEADERS=forwarded
KC_HOSTNAME=https://...external.location...
KC_HOSTNAME_STRICT=false
KC_LOG_LEVEL=DEBUG
Что может вызывать 403 на сфере, которую клиент только что смог создать самостоятельно?
Ответ или решение
Ситуация, с которой вы столкнулись при использовании Keycloak, относится к ошибке 403, возникающей при попытке добавления роли в вновь созданное царство. Несмотря на то, что ваша локальная настройка работает корректно, на сервере возникают проблемы, что может свидетельствовать о различных конфигурационных несоответствиях или проблемах с правами доступа.
1. Проверка прав доступа сервисной учетной записи
Одной из первых вещей, которую необходимо проверить, является соответствие прав доступа сервисной учетной записи, с помощью которой вы выполняете запросы на сервере. Хотя вы указали, что привязали все доступные роли к сервисной учетной записи, важно убедиться, что эти роли действительно наделяют права на управление ролями, Users и Realm.
Проверьте, есть ли у вашей сервисной учетной записи роль типа manage-realm
, которая необходима для управления ролями и пользователями в конкретном царстве. Убедитесь, что вся необходимая настройка ролей и привилегий актуальна и правильно сконфигурирована на сервере.
2. Проверка настроек конфигурации Keycloak
Разница в конфигурациях может оказать значительное влияние на работу Keycloak. Например, ваш локальный экземпляр работает без обратного прокси, тогда как удаленный экземпляр использует более сложную конфигурацию. Убедитесь, что настройки KC_PROXY_HEADERS
, KC_HOSTNAME
и KC_HOSTNAME_STRICT
корректны и соответствуют документации Keycloak.
Ваша настройка KC_PROXY_HEADERS=forwarded
указывает на использование заголовка Forwarded
, что может потребовать дополнительной настройки на уровне вашего обратного прокси. Также стоит проверить, корректно ли настроены правила маршрутизации и разрешены все необходимые HTTP-методы через прокси.
3. Логи Keycloak
Вы упомянули, что включили отладку логирования. Однако стоит обратить внимание на дополнительные логи, которые могут указывать на конкретные проблемы с правами доступа. При включенном отладочном режиме ищите записи, относящиеся к запросам, в которых возникает ошибка 403. Это может предоставить ценную информацию о том, какая именно часть проверки доступа не выполняется.
4. Сравнение экспорта Realm
Поскольку вы уже загрузили экспорт master
realm и проводили сравнение, стоит проанализировать это еще раз с акцентом на объекты, имеющие отношение к правам доступа и ролям. Часто неожиданное поведение может быть связано с настройками, не попадающими под регулярное сравнение.
Проверьте, чтобы роли и разрешения были настроены одинаково. Также можно попробовать создать новую сервисную учетную запись с минимально необходимыми правами и поэкспериментировать, добавляя только нужные роли, чтобы выяснить, какая именно из настроек и дает сбой.
5. Эксплуатационные моменты
Если у вас есть возможность, рекомендуется использовать инструмент мониторинга для отслеживания запросов и ответов между вашим приложением и Keycloak. Это может помочь выявить, где именно возникает проблема. Само по себе отсутствие успешного создания ролей может указывать на то, что служебный доступ был ограничен из-за сетевых вопросов или некорректной конфигурации.
Заключение
Ошибка 403 в Keycloak может быть вызвана множеством факторов, начиная от несанкционированного доступа до конфигурационных вопросов. Методично проверяйте настройки прав доступа, конфигурацию окружения, а также логи Keycloak, чтобы выявить причину проблемы. Использование вышеперечисленных подходов позволит вам диагностировать и решить возникшую проблему, обеспечив корректное функционирование вашего сервиса.