@xuxubla

Как связать роли rbac и модель пользователей?

1. Поставил чистый yii2.
2. Прилепил к нему dektrium/rbac.
3. Создал таблицу user (fk user.role to auth_item.name), а затем с помощью gii сгенерировал CRUD.
В итоге в модели есть такой рулз:
public function rules()
{
  return [
    ...
    [['role'], 'exist', 'skipOnError' => true, 'targetClass' => AuthItem::className(), 'targetAttribute' => ['role' => 'name']],
];
}


При создании записи он ругается, типа у AuthItem нет метода find. Можно убрать проверку, конечно. Но это небезопасно... Вывести выпадающий список-то можно без проблем,
а вот как бы мне валидировать это поле?
  • Вопрос задан
  • 253 просмотра
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
у AuthItem нет метода find

значит он унаследован от Model а не от ActiveRecords. Не знаю зачем так, но если надо создайте модель с помощью gii для таблицы с AuthItem (она будет унаследована от ActiveRecords и будет иметь метод find) и используйте для проверки ее.
Тут есть нюанс, мой метод и Ваша проверка будет работать только при хранении данных RBAC в БД. В yii2 есть несколько вариантов. Убедитесь, что используете yii\rbac\DbManager а не yii\rbac\PhpManager. Потому что во втором случае как раз метода find и не будет, так как данные хранятся не в db.
Ответ написан
Комментировать
qonand
@qonand
Software Engineer
При создании записи он ругается, типа у AuthItem нет метода find.

Так он и не может быть в классе наследуемом от \yii\base\Model это же не ActiveRecord, откуда ему там взяться.
Бегло просмотрев компонент, могу сказать что использование \yii\base\Model обусловлено тем что в Yii управление всей Rbac-системой построено на базе единого менеджера, имеющего различные реализации. К примеру в стандартной "комлектации" YII есть два менеджера yii\rbac\PhpManager (хранящий данные в файлах) и yii\rbac\DbManager (хранящий данные в базе). Кроме того есть возможность реализации собственного мендежера, на базе интерфейса yii\rbac\ManagerInterface. Соответственно НЕ использование ActiveRecord вполне логично, т.к. не известно на каком проекте какой менеджер будет использоваться.

Соответственно у Вас есть два варианта решения Вашей проблемы:
1. Если у Вас используется yii\rbac\DbManager Вы можете сами создать модель auth_item и использовать ее в Вашем правиле.
2. Использовать валидатор in + RBAC-менеджер, например:
['level', 'in', 'range' => Yii::$app->authManager->getRoles()],
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы