четверг, 17 апреля 2014 г.

User (пользователи) в YII.

Существует модуль user для фреймворка yii, который уже давно не поддерживается. Много людей его используют, но есть там и некоторые минусы. Для меня неудобства заключались как в именовании модуль/контроллер/экшн так и в весьма устаревшей модели шифрования паролей. Yii 2.0 еще не пробовал, работаю пока еще с версией Yii 1.1.14, в которой уже существует специальный класс для работы с паролями на основе криптоалгоритма Blowfish. 
Еще одна "недоделка" в модуле user на мой взгляд явилась в отсутствии поддержки токенов. Токены - это массив данных о пользователе, подписанный цифровой подписью. По сути это зашифрованная строка, которую очень легко расшифровать и получить исходный массив, но довольно сложно получить токен с данными для другого пользователя, для этого нужна цифровая подпись. 
Для формирования токенов, точнее для их подписи я решил использовать алгоритм SHA-256 + RSA. Если что, можно и SHA-512 конечно. Принцип довольно легкий - генерируются закрытый и открытый ключи для RSA. Закрытым ключом подписывается хэш массива - это и есть токен, для проверки валидности токена используется открытый ключ. 
Основное предназначение токена - хранит основную информацию о пользователе, без необходимости дополнительных обращений к БД и позволяет использовать кросс-доменные запросы, что очень удобно, когда, к примеру, модуль обмена сообщениями находится на другом поддомене (и другом сервере/серверах) для снижения нагрузки.
Для внедрения поддержки токенов в YII пришлось довольно сильно потрудиться... Самым логичным вариантом размещения проверки валидности токена был этап инициализации компонента user - класс, унаследованный от CWebUser. Но данный вариант весьма неудобно использовать при получении переменных, хранимых как члены класса. На данный момент Yii::app()->user === null. Поэтому использовать ActiveRecord, где используется обращение к данному компоненту, к сожалению, не получается. Я решил изменить схему расположения - вместо модуля будут обычные компоненты и модели внутри приложения и отдельные контроллеры для фронтэнда и бэкэнда. Свой вариант по мере доработки постараюсь выложить на GitHub.

Комментариев нет:

Отправить комментарий