В чем причина наличия правил авторизации в базе данных?

В моем приложении 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 в коде.