telegram

Часть 1. Legacy code PHP Symfony 2.8. и Keycloak

В жизни значительной части разработчиков рано или поздно появляется тот самый Legacy проект, который приходится изо всех сил поддерживать на плаву. В нашем случае мы столкнулись с проектом на Symfony 2.8 (2015-2019 гг.), который нужно было перевести на новый механизм SSO, а именно - Keycloak.
Немного технического контекста

Общая архитектура проекта выходит далеко за пределы темы этого поста. Псевдо-микросервисное приложение включает в себя:

  • Монолитная админка (Symfony 2.8 + Twig + NGINX)
  • Бэкенд основного сайта (Python Django)
  • Фронтенд основного сайта (Angular)
  • Базы данных, сервисы кэширования

Каждый из сервисов работает с отдельном Docker контейнере. Нашей конечной задачей было добавить контейнер с Keycloak на борту и заставить Symfony обращаться к нему за авторизацией. 

Поиск готовых решений

Непродолжительный поиск в Google навел на две сторонние библиотеки, разработанные для внедрения в Symfony возможности авторизации по OAuth2 и конкретно на подключение Keycloak.

Достаточно подробная документация и наличие гайда для legacy версий подкрепили готовность использовать именно их. 

Спойлер. Никакое решение не будет работать просто “из коробки”.

Первые попытки

Первая попытка, как водится, была сделана четко по инструкции. Для работы библиотек нужно было реализовать GuardAuthenticator, добавить маршруты для редиректа на сам Keycloak и для обмена кода авторизации на JWT токен. Начиная с этого момента выделились две глобальные проблемы, которые пришлось решить для полноценной интеграции.

  1. Проблемы с Symfony. Старая версия не может работать с Keycloak без некоторой доли кастомизации.
  2. Проблемы с Docker. Контейнеры должны взаимодействовать между собой на нескольких уровнях (на уровне хоста - редиректы в браузере, на уровне контейнеров - обмен кодами и токенами и проверка JWT).

Несмотря на выявленные проблемы, следование документации на первом этапе все же необходимо. Дальнейшая работа возможна только при условии, что все требования инструкций выполнены.

Кастомизация библиотек

Для нормальной работы авторизации нужно переопределить часть классов, предоставляемых библиотеками, с учетом возможностей Symfony 2.8 и спецификой конкретного приложения.

User и UserProvider

В давно функционирующих приложениях, как правило, существует устоявшаяся система ролей и проверки доступа. Частично эту проблему можно решить средствами самого Keycloak, однако, если в коде реализуются проверки на роли, которых нет и не должно быть на сервере авторизации, необходимо переопределить базовый класс пользователя.

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

Продолжение текста и поиска решения данного кейса, читайте во второй части статьи 
Часть 2. Legacy code PHP Symfony 2.8. и Keycloak

L.2022-12-01

Читать далее:

Работа с Веб-сокетами на PHP