Авторизация для фреймворка Phalcon
Библиотека для создания функционала аутентификации для сайта на базе фреймворка Phalcon
Мало мальское приложение, если это не landing page или контактная визитка, обычно имеет работу с пользователями. Функционал авторизации или точнее аутентификации (обычно мы смешиваем эти понятия, что в принципе не так страшно, но в голове нужно знать различие) обычно имеют схожую реализацию.
Аутентификация
Аутентификация это процесс входа на сайт, не важно каким способом. В процессе аутентификации мы неизвестного гостя идентифицируем на сайте, после аутентификации серфинг на сайте делает уже не просто какой то рандомный IP адрес, а конкретный пользователь. Появляется кнопка для «выхода», страницы смены пароля и т.д. Вот это вот превращение анонима в известного пользователя, это процесс аутентификации.
Так что говорить «форма авторизации» по сути неправильно, на самом деле это «форма аутентификации».
Авторизация
Авторизация же, это процесс проверки какой то конкретной возможности, доступности какого либо действия для пользователя. Authorization дословно переводится с английского как «разрешение». Действие которое мы разрешаем может быть абсолютно любым. Вы самостоятельно прописываете логику по которой будете разрешать или запрещать действие пользователю, а потом в тот момент когда пользователь уже собирается выполнять какое-то действие, заложенная логика срабатывает и пользователь либо дальше продолжит действие, либо натыкается на некий запрет, не позволящий ему сделать задуманное.
Если подходить ближе к практическим примерам, то реальной «возможностью» может быть например «возможность создания статьи». Вам в контроллер прилетает POST запрос, в котором лежит содержимое статьи, и в ответ на этот запрос вам нужно добавить статью и послать «ок», либо ответить ошибкой «доступ запрещен». Вам нужно разрешить или запретить создание для пользователя, или другими словами авторизовать действие.
Библиотека Phalcon Auth
Теперь когда вы понимаете различие в этих терминах, то можно перейти непосредственно к теме поста. Часто создавая проекты переносишь из одного в другой какие-то части кода, копируя нужный схожий функционал, так у меня часто происходит и с аутентификацией, чтобы сделать авторизацию и регистрацию пользователей на сайте.
В какой-то момент пришло осознание, что поры бы выделить всю логику в отдельную библиотеку, сказано - сделано. Итак, если вам нужно сделать аутентификацию у себя на сайте, на базе фреймворка Phalcon, встречайте Phalcon Auth.
За основу была взята система на базе Охранников (Guard) и поставщиков (Provider). Охранники определяют, как пользователи будут проходить аутентификацию, например с помощью стандартных Сессий, хранилища Сессий и файлов Cookie или, например, с помощью токена, если это api приложение.
Провайдеры определяют, откуда будут извлекаются пользователи. По-умолчанию это конечно же Phalcon\Model и строитель запросов к базе данных.
Данная концепция используется в популярных фреймворках, поэтому и была взята за основу, т.к. позволяет гибко настраивать функционал аутентификации, с возможность добавления новых охранников и провайдеров пользователей.
Возможности Phalcon Auth
Итак, на сегодняшний день, Phalcon Auth умеет логинить пользователя с помощью сессий, кук и токена.
Можно использовать функционал долгосрочной аутентификации с помощью "Запомнить меня", либо же наоборот, позволяет единоразово аутентифицировать пользователя без записи его в сессию.
И после удачного входа вы можете использовать получение пользователя в любом месте вашего приложения:
$this->auth->user();
//получить пользователя
$this->auth->id();
//получить id аутентифицированного пользователя
Более подробно можно прочитать в README на странице репозитория.
Регистрация, сброс пароля и пр.
Изучая подходы других людей, я видел библиотеки для авторизации Phalcon, которые включали в себя множество функций, будь то регистрация, сброс пароля, активация и пр. Но пихать все это в одну библиотеку как по мне слишком накладно, т.е. по сути что требуется от нее, получить данные от пользователя, проверить есть ли такой пользователь, запомнить его либо в сессию, либо просто отдать данные. И все, для этого и был сделан минимальный функционал для таких действий, и если кто-то будет искать в исходниках возможность сделать регистрацию, сброс пароля и пр. то такого не найдет, точнее не найдет полную реализацию, т.к. большинство из требуемого - это реализация на уровне контроллеров.
Например вот пример приложения, для понимания как работает библиотека https://github.com/sinbadxiii/phalcon-auth-example, тут максимально просто и доступно показано как можно сделать аутентификацию у себя на сайте.
Но чтобы сделать создание аутентификации, регистрации и пр. еще проще был создан репозиторий Phalcon Foundation Auth (пока работает в альфа режиме), подключив его и запустив скрипт инициализации, можно тут же пользоваться всем функционалом авторизации и регистрации, с возможностью "допиливания" нужных вещей. Библиотека предоставит вам stubs всех контроллеров, мидлваров и шаблонов.
Жду от вас Issues, т.к. пока не все оттестировано и возможно работоспособность не будет равна 100% :) но в свободное время постараюсь поскорей его допилить, так же добавив функционал сброса пароля, активации пользователя, бана и пр.
Артем24.02.2023
Пытаюсь ваш функционал использовать в мультимодульном проекте, но не выходит. Не могу выловить ошибку даже при помощи xdebug. Пробовал пойти от обратного и расширить ваш функционал готового проекта с авторизацией до мудьтимодульного - также безуспешно. Если у вас есть возможность создать репозиторий с мультимодульным проектом, буду вам безгранично благодарен🙏
Пишу проект под определенные требования:
Модель используется с entities, reposotories и services. Модели расширены на все модули. Каждый модуль имеет отдельные контроллеры, вьюшки, но модели, библиотеки и конфиги у всех одни и те же. Пишу на phalcon 5.
Сергей Мухин 02.03.2023
Артем, не должно быть проблем с многомодульностью, т.к. аутентификация привязывается к событиям в диспетчере, а там уже не важно, в каком модуле вы его используете. Но я примерно накидал как работать с модулями в примере аутентификации в ветке modules https://github.com/sinbadxiii/phalcon-auth-example/tree/modules