Настраиваем доступ к web приложению на основе ролей Yii 2. Часть 5. Особенности настройки при использовании PostgreSQL

Предыдущая статья этого цикла планировалась и даже объявлялась как последняя. Но, жизнь внесла свои коррективы и спустя полтора года я вновь возвращаюсь к этой теме по причине того, что использование штатного механизма RBAC фреймворка Yii 2 при использовании в качестве СУБД PostgreSQL сопряжено с некоторыми не совсем очевидными особенностями.

Дело в том, что в таблице auth_assignment, которая хранит связи между пользователями и их правами поле user_id (хранит id пользователя) имеет тип varchar (строка). В то время, как во многих (если не в большинстве) случаев id пользователя в соответствующей таблице является целым числом.

В случае MySQL попытка получить роли для пользователя при такой структуре таблицы ещё может быть успешной. Но, с PostgreSQL это не пройдёт и в результате выполнения запроса, который подразумевает JOIN с таблицей auth_assignment будет критическая ошибка.

Чтобы этого избежать следует перед добавлением пользователей и их ролей преобразовать тип данных столбца user_id.

Сделать это лучше всего в миграции выполнив несложный запрос:

this->execute('ALTER TABLE "auth_assignment" ALTER COLUMN "user_id" TYPE bigint USING ("user_id"::numeric::bigint)');

Если же ваш проект предполагает поддержку нескольких СУБД, то можно воспользоваться способом приведённым в одной из предыдущих статей, чтобы данный запрос не выполнялся в случае использования других СУБД.

if($this->isPostgreSQLdB(Yii::$app->getDb()->dsn)){
    $this->execute('ALTER TABLE "auth_assignment" ALTER COLUMN "user_id" TYPE bigint USING ("user_id"::numeric::bigint)');
}

Другие статьи из этого цикла

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *