В чем причина наличия правил авторизации в базе данных?
В моем приложении Yii я хочу, чтобы моя иерархия авторизации и бизнес-правила были написаны в коде, и я хочу, чтобы мои пользователи, роли и разрешения были сохранены в базе данных. Это отделяет мою бизнес-логику (которая должна быть кодом) от информации, которую она должна использовать (которая должна быть данными). Похоже, что Yii этого не поддерживает.
В Yii вы можете либо поместить свою бизнес-логику в файлы (CPhpAuthManager), либо в базу данных (CdbAuthManager). В любом случае, вы рассматриваете свою бизнес-логику как данные; Yii фактически извлечет вашу бизнес-логику в виде строк, а затем запустит ее через eval
, что кажется ужасным способом сделать это.
В чем причина этого?
Как я могу достичь желаемого результата?
Ответы
Ответ 1
Вы можете поместить столько логики, сколько хотите, в свой PHP-код для своей бизнес-логики. Yii поддерживает множество способов добавления этой логики, например. LoginForm.php, UserIdentity.php, SiteController.php,... здесь вы не ограничены.
То, что Yii также поддерживает, добавляет фрагмент логики в ваш RBAC. Обычным вариантом использования является то, что вы назначаете два правила "Authenticated" и "Guest" всем пользователям вашего сайта по умолчанию, но с bizRules.
Хотя "Authenticated" имеет bizRule, например
return !Yii::app()->user->isGuest;
"Гость" имеет
return Yii::app()->user->isGuest;
Результатом является то, что ваши зарегистрированные пользователи больше не "Гостей", а "Аутентифицированные".
Другим примером может быть просмотр видов для профилей пользователей, которые доступны только для текущего пользователя, например
return $model->id === Yii::app()->user->id;
Ответ 2
Почему вы помещаете что-либо в базу данных или код?
Одна из веских причин заключается в том, что не-разработчики могут ее редактировать.
В нашем приложении мы разрешаем пользователям управлять своими разрешениями для своих пользователей и элементов.
Вам не нужно использовать бизнес-правила yii rbac. Вы могли бы позволить сказать несколько разных ролей и задач и оставить остальную часть логики auth в коде.