RBAC - управление правами на основе ролей
В новой версии появился новый модуль Rbac — модуль управления правами на основе ролей и разрешений (RBAC).
Суть его сводится к тому, что теперь в админке можно создавать различные роли, давать ролям необходимые права (разрешения) и назначать эти роли пользователям. Роли могут наследовать от других ролей. Таким образом можно очень гибко настраивать систему управления правами.



Для работы с модулем в основном используются три метода:
Помимо простой проверки на наличие разрешений, можно добавить кастомную проверку прав. Для этого необходимо наследованием в модуль Rbac добавить свой метод. Пример для плагина Article:
Как видно из примера, название метода формируется из 'CheckCustom'+PluginName(если разрешение принадлежит плагину)+PermissionCodeName(код самого разрешения).
Сама проверка в коде (экшен управления статьями) выглядит так:
Параметр
Плагины обычно имеют предустановленный набор прав, который нужно создать при активации плагина. Для этого есть специальный метод
При деактивации плагина делаем так:
На данный момент новый функционал управления доступен только для плагинов. Стандартный функционал LS переведем на него позже.
Суть его сводится к тому, что теперь в админке можно создавать различные роли, давать ролям необходимые права (разрешения) и назначать эти роли пользователям. Роли могут наследовать от других ролей. Таким образом можно очень гибко настраивать систему управления правами.



Для работы с модулем в основном используются три метода:
IsAllow
для проверки прав текущего пользователя, GetMsgLast
для получения последнего сообщения об ошибке, ReturnActionError
удобный враппер для перенаправления на страницу ошибки с нужным сообщением.// для текущего пользователя $this->Rbac_IsAllow('topic_create'); // для конкретного пользователя с параметрами $this->Rbac_IsAllowUser($oUser,'topic_update',array('topic'=>$oTopic)); // для плагина 'article', указывается код плагина $this->Rbac_IsAllow('article_create','article'); // для плагина, где $this - любой текущий объект плагина (кроме Inherit классов) $this->Rbac_IsAllow('article_create',$this); // для плагина с параметрами $this->Rbac_IsAllow('article_update',$this,array('article'=>$oArticle));
Помимо простой проверки на наличие разрешений, можно добавить кастомную проверку прав. Для этого необходимо наследованием в модуль Rbac добавить свой метод. Пример для плагина Article:
class PluginArticle_ModuleRbac extends PluginArticle_Inherit_ModuleRbac { /** * Проверка прав на редактирование статьи * * @param $oUser * @param $aParams * * @return bool */ public function CheckCustomPluginArticleUpdate($oUser,$aParams) { if (!$oUser or !isset($aParams['article'])) { return false; } /** * Допускаем до редактирования всех с разрешением 'update_all' */ if ($this->Rbac_IsAllowUser($oUser,'update_all','article')) { return true; } /** * Допускаем до редактирования автора статьи */ if ($aParams['article']->getUserId()==$oUser->getId()) { return true; } /** * Запрещаем */ return false; } }
Как видно из примера, название метода формируется из 'CheckCustom'+PluginName(если разрешение принадлежит плагину)+PermissionCodeName(код самого разрешения).
Сама проверка в коде (экшен управления статьями) выглядит так:
/** * Права на редактирование */ if (!$this->Rbac_IsAllow('update',$this,array('article'=>$oArticle))) { return $this->Rbac_ReturnActionError(true); }
/** * Права на просмотр */ if (!$this->Rbac_IsAllow('view',$this)) { return $this->Rbac_ReturnActionError(); }
Параметр
true
у метода ReturnActionError
сообщает о том, что данный метод вызывается из стандартной админики, это необходимо для корректного отображения страницы с ошибкой.Плагины обычно имеют предустановленный набор прав, который нужно создать при активации плагина. Для этого есть специальный метод
CreatePermissions
, в который передается набор данных с необходимыми правами. Вот пример для плагина Article:public function Activate() { ........ /** * Создаем необходимые права доступа */ $aData=array( 'groups' => array( array('article','Статьи'), ), 'roles' => array( array('article_moderator','Модератор статей'), ), 'permissions' => array( array('view','Просмотр статьи','msg_error'=>'У вас нет прав на просмотр статьи','group'=>'article','roles'=>array('guest','user')), array('create','Создание статей','msg_error'=>'У вас нет прав на создание статьи','group'=>'article','roles'=>'user'), array('update_all','Правка всех статей','msg_error'=>'У вас нет прав на редактирование статьи','group'=>'article','roles'=>'article_moderator'), array('update','Правка своих статей','msg_error'=>'У вас нет прав на редактирование статьи','group'=>'article','roles'=>'user'), ), ); if (!$this->Rbac_CreatePermissions($aData,$this)) { return false; } ...... }
При деактивации плагина делаем так:
$this->Rbac_RemovePermissions(array( 'groups' => 'article', 'roles' => 'article_moderator', ),$this);
На данный момент новый функционал управления доступен только для плагинов. Стандартный функционал LS переведем на него позже.
22 комментария
Что касается, в частности, модели RBAC это вообще, мягко говоря, никаким боком не относится к yii. Немного непонятно, что вас смущает-то? Похожесть синтаксиса или что?
BlockStatInfo.class.php:
{insert name='block' block='statInfo' params=[ 'user' => $oUserCurrent, 'role' => 'user']}
classes/blocks/BlockStatInfo.class.php:
frontend/skin/ваш_шаблон/blocks/block.statInfo.tpl:
Но если вернуться к первому варианту, что я делаю не так? Создал BlockStatInfo.class.php в application/classes/blocks с содержимым
Создал в application/frontend/components компонент test с шаблоном test
В конфиге шаблона подключил. В шаблоне прописал вставил
Все что идет до блока загружается, все что после, включая сам блок — нет.