В жизни значительной части разработчиков рано или поздно появляется тот самый Legacy проект, который приходится изо всех сил поддерживать на плаву. В нашем случае мы столкнулись с проектом на Symfony 2.8 (2015-2019 гг.), который нужно было перевести на новый механизм SSO, а именно - Keycloak.
Немного технического контекста
Общая архитектура проекта выходит далеко за пределы темы этого поста. Псевдо-микросервисное приложение включает в себя:
Каждый из сервисов работает с отдельном Docker контейнере. Нашей конечной задачей было добавить контейнер с Keycloak на борту и заставить Symfony обращаться к нему за авторизацией.
Непродолжительный поиск в Google навел на две сторонние библиотеки, разработанные для внедрения в Symfony возможности авторизации по OAuth2 и конкретно на подключение Keycloak.
Достаточно подробная документация и наличие гайда для legacy версий подкрепили готовность использовать именно их.
Спойлер. Никакое решение не будет работать просто “из коробки”.
Первые попытки
Первая попытка, как водится, была сделана четко по инструкции. Для работы библиотек нужно было реализовать GuardAuthenticator, добавить маршруты для редиректа на сам Keycloak и для обмена кода авторизации на JWT токен. Начиная с этого момента выделились две глобальные проблемы, которые пришлось решить для полноценной интеграции.
Несмотря на выявленные проблемы, следование документации на первом этапе все же необходимо. Дальнейшая работа возможна только при условии, что все требования инструкций выполнены.
Для нормальной работы авторизации нужно переопределить часть классов, предоставляемых библиотеками, с учетом возможностей Symfony 2.8 и спецификой конкретного приложения.
В давно функционирующих приложениях, как правило, существует устоявшаяся система ролей и проверки доступа. Частично эту проблему можно решить средствами самого Keycloak, однако, если в коде реализуются проверки на роли, которых нет и не должно быть на сервере авторизации, необходимо переопределить базовый класс пользователя.
После этого более не получится пользоваться классом UserProvider, предоставляемым внешней библиотекой. Для дальнейшей работы придется переопределить и его, прописав поддержку нашего нового класса пользователей с кастомным набором дополнительных методов.
Продолжение текста и поиска решения данного кейса, читайте во второй части статьи
Часть 2. Legacy code PHP Symfony 2.8. и Keycloak
Читать далее:
Работа с Веб-сокетами на PHP
Читать далее:
Работа с Веб-сокетами на PHP