Skip to content

RBAC Права на основе ролей

archaron edited this page Mar 30, 2013 · 5 revisions

1. Модель UserAuthItem - таблица user_auth_item

Представляет собой объект авторизации. Может быть трех типов:

UserAuthItem::USER_RBAC_OPERATION Представляет собой конечное действие, например "Создание новости", "Редактирование своих новостей", "Редактирование любых новостей" и т.д. Обычно не назначается напрямую пользователю, а входит в состав "задач". Хотя, можно и отдельному пользователю назначить одну единственную операцию.

UserAuthItem::USER_RBAC_TASK Задача - группа действий, например "Администрирование новостей" или "Управление пользователями". Назначается одной или нескольким ролям (группам) пользователей. Может быть также назначена одному пользователю "в порядке исключения". Обычно модуль содержит несколько таких задач. Задача содержит одно или несколько действий. Например:

  • Задача: Управление новостями
  • Действие: Создание новости
  • Действие: Редактирование своих новостей
  • Действие: Удаление своих новостей .....

UserAuthItem::USER_RBAC_ROLE Роль пользователя, также является группой пользователей. К роли привязаны одна или несколько задач. Например: "Администратор", "Редактор" и т.д. При назначении какой-либо роли пользователю, последний получает доступ ко всем задачам, которые назначены данной роли, и в свою очередь, через них - к действиям.

name - имя объекта

type - Тип объекта (см. выше)

module - модуль, для которого предназначен данный объект

description - Краткое описание

bizrule - Правило назначения доступа ( например return !Yii::app()->user->isGuest; будет назначать если пользователь - не гость )

data - Данные, которые передаются при проверке доступа в правило bizrule (например, можно передать редактируемую модельку, чтобы правило автоматически проверило, является ли пользователь владельцем) detailed_description - полное описание объекта (с пояснением, что делает данный объект и что дает делать)

2. Модель UserAuthItemChild - таблица user_auth_item_child

Используется для древовидной связки между собой объектов авторизации (действий к задачам, задач к ролям и т.д.).

##3. Модель UserAuthItemAssignmen - таблица user_auth_item_assignment

Содержит назначение прав пользователям.

itemname - Объект доступа

userid - Пользователь, которому дается доступ

bizrule - Правило назначения доступа ( например return !Yii::app()->user->isGuest; будет назначать если пользователь - не гость )

data - Данные, которые передаются при проверке доступа в правило bizrule (например, можно передать редактируемую модельку, чтобы правило автоматически проверило, является ли пользователь владельцем)

Объекты могут назначаться двумя способами.

  1. Через таблицу assignment

  2. Через бизнес-правило, которое разрешит автоматически после проверки доступ.

Кстати, можно добавить в config/modules/user.php в секцию

'defaultRoles'=>array('authenticated', 'guest'),

роли, которые нужно проверить при старте. Так, например, по умолчанию проверяется и назначается роль authenticated (авторизованный пользователь) и guest (не авторизованный пользователь). Назначение происходит путем проверки истинности правила назначения соответствующего объекта.

Как проверять доступ?

Элементарно. Yii::app()->user->checkAccess('authenticated') к примеру, проверит аутентифицирован ли пользователь?

Yii::app()->user->checkAccess('admin') проверит, имеет ли пользователь роль "Администратор". Собственно эта роль должна (по идее) собирать все возможные задачи в себе.

Yii::app()->user->checkAccess('canDoSomething') типичная проверка доступа пользователя к какому-то действию.

Какие есть роли по умолчанию?

Их немного:

  • admin Администраторы, должны уметь все

  • authenticated Аутентифицированные пользователи, которые авторизовались в системе. Тоже самое что !isGuest(). Назначается автоматически.

  • guest Гость - пользователь еще не входил, а просто зашел посмотреть :) Назначается по умолчанию всем пользователям, аналогично isGuest()

  • editors Редакторы - пользователи, которые не должны иметь доступ к важным настройкам, а только и могут что забивать контент.