Цикл постов про Keycloak. Часть вторая: Контроль доступа на уровне приложения

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Данная статья является продолжением серии материалов по внедрению Keycloak в качестве провайдера авторизации. [спойлер: в конце вас ждет разочарование]

Первая часть

В прошлый раз мы настроили ABAC (Attribute Based Access Control) с использованием Keycloak, теперь реализуем проверку разрешений на уровне приложения.

Есть различные способы реализовать контроль доступа с использованием Keycloak на уровне вашего приложения, например использование средств Spring Security, как описано в статье от Baeldung. Однако в нашем случае не получится ограничиться исключительно группами / ролями пользователя так как требуется также учитывать его кастомные атрибуты доступа.

В прошлой части статьи мы добились возможности проверять разрешение пользователя через интерфейс Keycloak. Теперь нам нужно проделать то же самое, только используя API. Реализовав логику проверки разрешений с помощью API Keycloak мы сможем затем инкапсулировать ее в Spring Interceptor (перехватчик запросов).

Проверка разрешения представляет собой следующий алгоритм:

  1. Извлекаем из запроса URL;

  2. Используя URL получаем идентификатор ресурса, ассоциированного с нашим URL;

  3. Используя идентификатор ресурса и токен авторизации, проверяем разрешение для конкретного пользователя.

Схема проверки разрешения
Схема проверки разрешения

Для того чтобы получить идентификатор ресурса мы можем воспользоваться следующим запросом:

curl --location --request GET  $KEYCLOAK_HOST/realms/$REALM_NAME/authz/protection/resource_set?uri=/api/me' \
--header 'Authorization: Bearer $KEYCLOAK_TEC_USER_TOKEN'

Немного подробнее про конечную точку resource_set можно прочитать тут.

Чтобы проверить доступ к конкретному ресурсу нам понадобится та же конечная точка, что и для получения токена, однако со специфичным набором параметров:

curl --location --request POST '$KEYCLOAK_HOST/realms/$REALM_NAME/protocol/openid-connect/token/' \
--header 'Authorization: Bearer$KEYCLOAK_TEC_USER_TOKEN ' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:uma-ticket' \
--data-urlencode 'audience=$CLIENT_NAME' \
--data-urlencode 'response_mode=decision' \
--data-urlencode 'permission=$RESOURCE_ID'

Подробнее про проверку разрешения на конкретный ресурс, можно почитать здесь.

Признаюсь честно, в конечном итоге я отказался от данной архитектуры, и на то был ряд причин:

  1. Увеличение трафика в несколько раз, на каждый авторизованный запрос теперь приходится 2 дополнительных запроса в Keycloak, что в свою очередь замедляет систему и порождает существенные требования по RPS для инсталляции Keycloak.

  2. Сопровождение и миграции. Сопровождение политик написанных на JS оказалось чересчур трудоемким и повлекло существенные накладные расходы, более того, на момент реализации данного решения Keycloak не располагал средствами миграции, иными словами мне не удалось реализовать надежный способ миграции состояния Keycloak (ресурсы, разрешения, политики, мапперы и тд), который можно было бы встроить в СI/CD, что в свою очередь частично обесценило хранение настроек Keycloak в коде.

В конечном итоге было принято решение оставить ABAC на стороне приложения, а Keycloak использовать только для Identity пользователей.

Источник: https://habr.com/ru/articles/772010/


Интересные статьи

Интересные статьи

Приветствую тебя, дорогой читатель, в восьмой части серии статей «Приручение черногодракона. Этичный хакинг с Kali Linux».Полный список статей прилагается ниже, и будет дополняться по мере появления ...
Добрый день, уважаемый читатель Хабра! Меня зовут Вартанян Артур и я работаю в компании Reksoft Java-разработчиком. В данной статье мы напишем свой собственный вариант реализации валидации для объекто...
В этой части я коротко расскажу о мотивах и с чего начиналась разработка. Меня зовут Алексей и я желаю вам приятного чтения! Идея Тут все произошло более чем спонтанно зимнем вечером ...
Вы узнаете, как создавался PowerPoint, какие возможности были в ранних версиях программы и почему сервис Keynote стал ее первым серьезным конкурентом. Мы уже рассказали вам о пер...
Привет! Меня зовут Валерий Богданов, и я отвечаю в Мир Plat.Form за тестирование в команде мобильных платежей. Я уже писал, что в 2018 году мы запустили сервис мобильных платежей и в связ...