mirror of
https://github.com/Oreolek/ifhub.club.git
synced 2024-06-26 03:30:48 +03:00
Доработка модуля Rbac - управление правами пользователей
This commit is contained in:
parent
a4e34c64aa
commit
8a3666e04f
|
@ -21,26 +21,77 @@
|
|||
|
||||
/**
|
||||
* Модуль управления правами на основе ролей и разрешений
|
||||
* Для проверки прав доступны два метода - для текущего пользователя и для любого.
|
||||
* <pre>
|
||||
* // для текущего пользователя
|
||||
* $this->Rbac_IsAllow('topic_create');
|
||||
* // для конкретного пользователя с параметрами
|
||||
* $this->Rbac_IsAllowUser($oUser,'topic_update',array('topic'=>$oTopic));
|
||||
* // для плагина 'article', указывается код плагина
|
||||
* $this->Rbac_IsAllow('article_create','article');
|
||||
* // для плагина, где $this - любой текущий объект плагина
|
||||
* $this->Rbac_IsAllow('article_create',$this);
|
||||
* // для плагина с параметрами
|
||||
* $this->Rbac_IsAllow('article_update',$this,array('article'=>$oArticle));
|
||||
* </pre>
|
||||
*/
|
||||
class ModuleRbac extends ModuleORM {
|
||||
|
||||
/**
|
||||
* Код системной гостевой роли.
|
||||
* Всем неавторизованным пользователям присваивается эта роль
|
||||
*/
|
||||
const ROLE_CODE_GUEST='guest';
|
||||
|
||||
/**
|
||||
* Статусы разрешений
|
||||
*/
|
||||
const PERMISSION_STATE_ACTIVE=1;
|
||||
const PERMISSION_STATE_INACTIVE=0;
|
||||
|
||||
/**
|
||||
* Статусы ролей
|
||||
*/
|
||||
const ROLE_STATE_ACTIVE=1;
|
||||
const ROLE_STATE_INACTIVE=0;
|
||||
|
||||
/**
|
||||
* Внутренний кеш ролей пользователя
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aUserRoleCache=array();
|
||||
/**
|
||||
* Внутренний кеш всех ролей
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aRoleCache=array();
|
||||
/**
|
||||
* Внутренний кеш разрешений для ролей
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aRulePermissionCache=array();
|
||||
/**
|
||||
* Внутренний кеш всех используемых разрешений
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aPermissionCache=array();
|
||||
|
||||
/**
|
||||
* Хранит последнее сообщение о неудачной проверке прав
|
||||
*
|
||||
* @var null|string
|
||||
*/
|
||||
protected $sMessageLast=null;
|
||||
|
||||
/**
|
||||
* Объект маппера
|
||||
*
|
||||
* @var ModuleRbac_MapperRbac
|
||||
*/
|
||||
protected $oMapper=null;
|
||||
|
||||
/**
|
||||
* Инициализация модуля
|
||||
*/
|
||||
public function Init() {
|
||||
parent::Init();
|
||||
$this->oMapper=Engine::GetMapper(__CLASS__);
|
||||
|
@ -48,19 +99,55 @@ class ModuleRbac extends ModuleORM {
|
|||
/**
|
||||
* Проверяет разрешение для текущего авторизованного пользователя
|
||||
*
|
||||
* @param string $sPermissionCode
|
||||
* @param array $aParams
|
||||
* @param string $sPermissionCode Код разрешения
|
||||
* @param mixed $aParamsOrPlugin Параметры или плагин
|
||||
* @param mixed $sPluginOrParams Плагин или параметры
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function IsAllow($sPermissionCode,$aParams=array()) {
|
||||
return $this->IsAllowUser($this->User_GetUserCurrent(),$sPermissionCode,$aParams);
|
||||
public function IsAllow($sPermissionCode,$aParamsOrPlugin=array(),$sPluginOrParams=null) {
|
||||
return $this->IsAllowUser($this->User_GetUserCurrent(),$sPermissionCode,$aParamsOrPlugin,$sPluginOrParams);
|
||||
}
|
||||
|
||||
public function IsAllowUser($oUser,$sPermissionCode,$aParams=array()) {
|
||||
/**
|
||||
* Проверяет разрешение для конкретного пользователя
|
||||
*
|
||||
* @param ModuleUser_EntityUser $oUser Пользователь
|
||||
* @param string $sPermissionCode Код разрешения
|
||||
* @param mixed $aParamsOrPlugin Параметры или плагин
|
||||
* @param mixed $sPluginOrParams Плагин или параметры
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function IsAllowUser($oUser,$sPermissionCode,$aParamsOrPlugin=array(),$sPluginOrParams=null) {
|
||||
$aParams=array();
|
||||
$sPlugin=null;
|
||||
if (!is_array($sPluginOrParams)) {
|
||||
$sPlugin=$sPluginOrParams;
|
||||
} else {
|
||||
$aParams=$sPluginOrParams;
|
||||
}
|
||||
if (is_array($aParamsOrPlugin)) {
|
||||
$aParams=$aParamsOrPlugin;
|
||||
} else {
|
||||
$sPlugin=$aParamsOrPlugin;
|
||||
}
|
||||
return $this->IsAllowUserFull($oUser,$sPermissionCode,$aParams,$sPlugin);
|
||||
}
|
||||
/**
|
||||
* Проверяет разрешение для конкретного пользователя
|
||||
*
|
||||
* @param ModuleUser_EntityUser $oUser Пользователь
|
||||
* @param string $sPermissionCode Код разрешения
|
||||
* @param array $aParams Параметры
|
||||
* @param mixed $sPlugin Плагин, можно указать код плагина, название класса или объект
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function IsAllowUserFull($oUser,$sPermissionCode,$aParams=array(),$sPlugin=null) {
|
||||
if (!$sPermissionCode) {
|
||||
return false;
|
||||
}
|
||||
$sPlugin=$sPlugin ? Plugin::GetPluginCode($sPlugin) : '';
|
||||
/**
|
||||
* Загружаем все роли и пермишены
|
||||
*/
|
||||
|
@ -77,7 +164,7 @@ class ModuleRbac extends ModuleORM {
|
|||
$aRoles=$this->GetRoleByCodeAndState(self::ROLE_CODE_GUEST,self::ROLE_STATE_ACTIVE);
|
||||
$aRoles=$aRoles ? array($aRoles) : array();
|
||||
} else {
|
||||
$aRoles=$oUser->getRolesActive();
|
||||
$aRoles=$this->GetRolesByUser($oUser);
|
||||
}
|
||||
$this->aUserRoleCache[$sUserId]=$aRoles;
|
||||
} else {
|
||||
|
@ -88,11 +175,14 @@ class ModuleRbac extends ModuleORM {
|
|||
*/
|
||||
$sPermissionCode=func_underscore($sPermissionCode);
|
||||
foreach($aRoles as $oRole) {
|
||||
if ($this->CheckPermissionByRole($oRole,$sPermissionCode)) {
|
||||
if ($this->CheckPermissionByRole($oRole,$sPermissionCode,$sPlugin)) {
|
||||
/**
|
||||
* У роли есть необходимый пермишен, теперь проверим на возможную кастомную обработку с параметрами
|
||||
* Для плагинов: CheckCustomPluginArticleCreate
|
||||
* Для ядра: CheckCustomCreate
|
||||
*/
|
||||
$sMethod='CheckCustom'.func_camelize($sPermissionCode);
|
||||
$sAdd=$sPlugin ? ('Plugin'.func_camelize($sPlugin)) : '';
|
||||
$sMethod='CheckCustom'.$sAdd.func_camelize($sPermissionCode);
|
||||
if (method_exists($this,$sMethod)) {
|
||||
if (call_user_func(array($this,$sMethod),$oUser,$aParams)) {
|
||||
return true;
|
||||
|
@ -102,8 +192,11 @@ class ModuleRbac extends ModuleORM {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (isset($this->aPermissionCache[$sPermissionCode])) {
|
||||
$aPerm=$this->aPermissionCache[$sPermissionCode];
|
||||
/**
|
||||
* Формируем сообщение об ошибке
|
||||
*/
|
||||
if (isset($this->aPermissionCache[$sPlugin][$sPermissionCode])) {
|
||||
$aPerm=$this->aPermissionCache[$sPlugin][$sPermissionCode];
|
||||
if ($aPerm['msg_error']) {
|
||||
$sMsg=$aPerm['msg_error'];
|
||||
} else {
|
||||
|
@ -115,7 +208,63 @@ class ModuleRbac extends ModuleORM {
|
|||
$this->sMessageLast=$sMsg;
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Возвращает список ролей пользователя
|
||||
* На самом деле этот метод можно было бы заменить на $oUser->getRolesActive(), если бы сущность User была ORM
|
||||
*
|
||||
* @param ModuleUser_EntityUser|int $oUser
|
||||
* @param bool $bActiveOnly Учитывать только активные роли
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function GetRolesByUser($oUser,$bActiveOnly=true) {
|
||||
if (!$oUser) {
|
||||
return array();
|
||||
}
|
||||
if (is_object($oUser)) {
|
||||
$iUserId=$oUser->getId();
|
||||
} else {
|
||||
$iUserId=$oUser;
|
||||
}
|
||||
/**
|
||||
* Сначала получаем все связи
|
||||
*/
|
||||
$aRoleUserItems=$this->GetRoleUserItemsByFilter(array('user_id'=>$iUserId,'#index-from'=>'role_id'));
|
||||
$aRoleIds=array_keys($aRoleUserItems);
|
||||
/**
|
||||
* Теперь получаем список ролей
|
||||
*/
|
||||
if ($aRoleIds) {
|
||||
$aFilter=array('id in'=>$aRoleIds);
|
||||
if ($bActiveOnly) {
|
||||
$aFilter['state']=self::ROLE_STATE_ACTIVE;
|
||||
}
|
||||
return $this->GetRoleItemsByFilter($aFilter);
|
||||
}
|
||||
return array();
|
||||
}
|
||||
/**
|
||||
* Возвращает количество пользователей у роли
|
||||
*
|
||||
* @param ModuleRbac_EntityRole|int $oRole
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function GetCountUsersByRole($oRole) {
|
||||
if (!$oRole) {
|
||||
return 0;
|
||||
}
|
||||
if (is_object($oRole)) {
|
||||
$iRoleId=$oRole->getId();
|
||||
} else {
|
||||
$iRoleId=$oRole;
|
||||
}
|
||||
|
||||
return $this->GetCountItemsByFilter(array('role_id'=>$iRoleId),'ModuleRbac_EntityRoleUser');
|
||||
}
|
||||
/**
|
||||
* Выполняет загрузку в кеш ролей и разрешений
|
||||
*/
|
||||
protected function LoadRoleAndPermissions() {
|
||||
/**
|
||||
* Роли
|
||||
|
@ -126,18 +275,22 @@ class ModuleRbac extends ModuleORM {
|
|||
*/
|
||||
$this->LoadPermissions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Загружает в кеш разрешения
|
||||
*/
|
||||
protected function LoadPermissions() {
|
||||
if ($this->aRulePermissionCache) {
|
||||
return;
|
||||
}
|
||||
$aResult=$this->oMapper->GetRoleWithPermissions();
|
||||
foreach($aResult as $aRow) {
|
||||
$this->aRulePermissionCache[$aRow['role_id']][]=$aRow['code'];
|
||||
$this->aPermissionCache[$aRow['code']]=$aRow;
|
||||
$this->aRulePermissionCache[$aRow['role_id']][$aRow['plugin']][]=$aRow['code'];
|
||||
$this->aPermissionCache[$aRow['plugin']][$aRow['code']]=$aRow;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Загружает в кеш роли
|
||||
*/
|
||||
protected function LoadRoles() {
|
||||
if ($this->aRoleCache) {
|
||||
return;
|
||||
|
@ -147,13 +300,21 @@ class ModuleRbac extends ModuleORM {
|
|||
$this->aRoleCache[$oRole->getId()]=$oRole;
|
||||
}
|
||||
}
|
||||
|
||||
protected function CheckPermissionByRole($oRole,$sPermissionCode) {
|
||||
/**
|
||||
* Проверяет наличие разрешения у конкретной роли, читывается наследование ролей
|
||||
*
|
||||
* @param ModuleRbac_EntityRole $oRole Объект роли
|
||||
* @param string $sPermissionCode Код разрешения
|
||||
* @param string $sPlugin Код плагина или пустая строка (разрешения ядра)
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function CheckPermissionByRole($oRole,$sPermissionCode,$sPlugin='') {
|
||||
/**
|
||||
* Проверяем наличие пермишена в текущей роли
|
||||
*/
|
||||
if (isset($this->aRulePermissionCache[$oRole->getId()])) {
|
||||
if (in_array($sPermissionCode,$this->aRulePermissionCache[$oRole->getId()])) {
|
||||
if (isset($this->aRulePermissionCache[$oRole->getId()][$sPlugin])) {
|
||||
if (in_array($sPermissionCode,$this->aRulePermissionCache[$oRole->getId()][$sPlugin])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -161,12 +322,45 @@ class ModuleRbac extends ModuleORM {
|
|||
* Смотрим родительскую роль
|
||||
*/
|
||||
if ($oRole->getPid() and isset($this->aRoleCache[$oRole->getPid()])) {
|
||||
return $this->CheckPermissionByRole($this->aRoleCache[$oRole->getPid()],$sPermissionCode);
|
||||
return $this->CheckPermissionByRole($this->aRoleCache[$oRole->getPid()],$sPermissionCode,$sPlugin);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает последнее сообщение о неудачной проверке прав
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public function GetMsgLast() {
|
||||
return $this->sMessageLast;
|
||||
}
|
||||
/**
|
||||
* Добавляет роль к пользователю
|
||||
*
|
||||
* @param ModuleRbac_EntityRole|string $oRole Объект роли или код роли
|
||||
* @param int|ModuleUser_EntityUser $iUserId Объект пользователя или его ID
|
||||
*
|
||||
* @return bool|Entity
|
||||
*/
|
||||
public function AddRoleToUser($oRole,$iUserId) {
|
||||
if (is_string($oRole)) {
|
||||
$oRole=$this->GetRoleByCode($oRole);
|
||||
}
|
||||
if (is_object($iUserId)) {
|
||||
$iUserId=$iUserId->getId();
|
||||
}
|
||||
if (!$oRole or !$iUserId) {
|
||||
return false;
|
||||
}
|
||||
if (!($oRoleUser=$this->Rbac_GetRoleUserByFilter(array('role_id'=>$oRole->getId(),'user_id'=>$iUserId)))) {
|
||||
/**
|
||||
* Добавляем
|
||||
*/
|
||||
$oRoleUser=Engine::GetEntity('ModuleRbac_EntityRoleUser');
|
||||
$oRoleUser->setRoleId($oRole->getId());
|
||||
$oRoleUser->setUserId($iUserId);
|
||||
$oRoleUser->Add();
|
||||
}
|
||||
return $oRoleUser;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
<?php
|
||||
/**
|
||||
* LiveStreet CMS
|
||||
* Copyright © 2013 OOO "ЛС-СОФТ"
|
||||
*
|
||||
* ------------------------------------------------------
|
||||
*
|
||||
* Official site: www.livestreetcms.com
|
||||
* Contact e-mail: office@livestreetcms.com
|
||||
*
|
||||
* GNU General Public License, version 2:
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
* ------------------------------------------------------
|
||||
*
|
||||
* @link http://www.livestreetcms.com
|
||||
* @copyright 2013 OOO "ЛС-СОФТ"
|
||||
* @author Maxim Mzhelskiy <rus.engine@gmail.com>
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Сущность группы для логического объединения разрешений
|
||||
*/
|
||||
class ModuleRbac_EntityGroup extends EntityORM {
|
||||
/**
|
||||
* Определяем правила валидации
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aValidateRules=array(
|
||||
array('title','string','max'=>200,'min'=>1,'allowEmpty'=>false),
|
||||
array('code','regexp','pattern'=>'/^[\w\-_]+$/i','allowEmpty'=>false),
|
||||
array('code','check_code'),
|
||||
);
|
||||
/**
|
||||
* Связи ORM
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aRelations=array(
|
||||
'permissions' => array(self::RELATION_TYPE_HAS_MANY,'ModuleRbac_EntityPermission','group_id'),
|
||||
);
|
||||
|
||||
/**
|
||||
* Валидация кода группы
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public function ValidateCheckCode() {
|
||||
if ($oObject=$this->Rbac_GetGroupByCode($this->getCode())) {
|
||||
if ($this->getId()!=$oObject->getId()) {
|
||||
return 'Код должен быть уникальным';
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Выполняется перед сохранением
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function beforeSave() {
|
||||
if ($bResult=parent::beforeSave()) {
|
||||
if ($this->_isNew()) {
|
||||
$this->setDateCreate(date("Y-m-d H:i:s"));
|
||||
}
|
||||
}
|
||||
return $bResult;
|
||||
}
|
||||
/**
|
||||
* Возвращает URL админки для редактирования
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUrlAdminUpdate() {
|
||||
return Router::GetPath('admin/users/rbac/group-update/'.$this->getId());
|
||||
}
|
||||
/**
|
||||
* Возвращает URL админки для удаления
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUrlAdminRemove() {
|
||||
return Router::GetPath('admin/users/rbac/group-remove/'.$this->getId());
|
||||
}
|
||||
}
|
|
@ -19,8 +19,82 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Сущность разрешения
|
||||
*/
|
||||
class ModuleRbac_EntityPermission extends EntityORM {
|
||||
/**
|
||||
* Определяем правила валидации
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aValidateRules=array(
|
||||
array('title','string','max'=>200,'min'=>1,'allowEmpty'=>false),
|
||||
array('msg_error','string','max'=>250,'min'=>1,'allowEmpty'=>true),
|
||||
array('code','regexp','pattern'=>'/^[\w\-_]+$/i','allowEmpty'=>false),
|
||||
array('code','check_code'),
|
||||
array('group_id','check_group'),
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* Валидация группы
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public function ValidateCheckGroup() {
|
||||
if ($this->getGroupId()) {
|
||||
if ($oObject=$this->Rbac_GetGroupById($this->getGroupId())) {
|
||||
$this->setGroupId($oObject->getId());
|
||||
} else {
|
||||
return 'Неверная группа';
|
||||
}
|
||||
} else {
|
||||
$this->setGroupId(null);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Валидация кода
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public function ValidateCheckCode() {
|
||||
$sPlugin=$this->getPlugin() ? $this->getPlugin() : '';
|
||||
if ($oObject=$this->Rbac_GetPermissionByCodeAndPlugin($this->getCode(),$sPlugin)) {
|
||||
if ($this->getId()!=$oObject->getId()) {
|
||||
return 'Код должен быть уникальным';
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Выполняется перед сохранением
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function beforeSave() {
|
||||
if ($bResult=parent::beforeSave()) {
|
||||
if ($this->_isNew()) {
|
||||
$this->setDateCreate(date("Y-m-d H:i:s"));
|
||||
}
|
||||
}
|
||||
return $bResult;
|
||||
}
|
||||
/**
|
||||
* Возвращает URL админки для редактирования
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUrlAdminUpdate() {
|
||||
return Router::GetPath('admin/users/rbac/permission-update/'.$this->getId());
|
||||
}
|
||||
/**
|
||||
* Возвращает URL админки для удаления
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUrlAdminRemove() {
|
||||
return Router::GetPath('admin/users/rbac/permission-remove/'.$this->getId());
|
||||
}
|
||||
|
||||
}
|
|
@ -19,10 +19,105 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Сущность роли, которая назначается пользователям
|
||||
*/
|
||||
class ModuleRbac_EntityRole extends EntityORM {
|
||||
|
||||
/**
|
||||
* Определяем правила валидации
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aValidateRules=array(
|
||||
array('title','string','max'=>200,'min'=>1,'allowEmpty'=>false),
|
||||
array('code','regexp','pattern'=>'/^[\w\-_]+$/i','allowEmpty'=>false),
|
||||
|
||||
array('code','check_code'),
|
||||
array('pid','parent_role'),
|
||||
);
|
||||
/**
|
||||
* Связи ORM
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $aRelations=array(
|
||||
'permissions' => array(self::RELATION_TYPE_MANY_TO_MANY,'ModuleRbac_EntityPermission', 'permission_id', 'ModuleRbac_EntityRolePermission', 'role_id'),
|
||||
self::RELATION_TYPE_TREE,
|
||||
);
|
||||
|
||||
/**
|
||||
* Переопределяем имя поля с родителем
|
||||
* Т.к. по дефолту в деревьях используется поле parent_id
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function _getTreeParentKey() {
|
||||
return 'pid';
|
||||
}
|
||||
/**
|
||||
* Выполняется перед сохранением
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function beforeSave() {
|
||||
if ($bResult=parent::beforeSave()) {
|
||||
if ($this->_isNew()) {
|
||||
$this->setDateCreate(date("Y-m-d H:i:s"));
|
||||
}
|
||||
}
|
||||
return $bResult;
|
||||
}
|
||||
/**
|
||||
* Валидация кода
|
||||
*
|
||||
* @return bool|string
|
||||
*/
|
||||
public function ValidateCheckCode() {
|
||||
if ($oObject=$this->Rbac_GetRoleByCode($this->getCode())) {
|
||||
if ($this->getId()!=$oObject->getId()) {
|
||||
return 'Код должен быть уникальным';
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Проверка родительской роли
|
||||
*
|
||||
* @param string $sValue Валидируемое значение
|
||||
* @param array $aParams Параметры
|
||||
* @return bool
|
||||
*/
|
||||
public function ValidateParentRole($sValue,$aParams) {
|
||||
if ($this->getPid()) {
|
||||
if ($oRole=$this->Rbac_GetRoleById($this->getPid())) {
|
||||
if ($oRole->getId()==$this->getId()) {
|
||||
return 'Попытка вложить роль в саму себя';
|
||||
}
|
||||
} else {
|
||||
return 'Неверная роль';
|
||||
}
|
||||
} else {
|
||||
$this->setPid(null);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Возвращает количество пользователей с данной ролью
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getCountUsers() {
|
||||
return $this->Rbac_GetCountUsersByRole($this);
|
||||
}
|
||||
/**
|
||||
* Возвращает URL админки для различных действий над ролью, например, редактирование
|
||||
*
|
||||
* @param $sAction
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUrlAdminAction($sAction) {
|
||||
return Router::GetPath('admin/users/rbac/role-'.$sAction.'/'.$this->getId());
|
||||
}
|
||||
}
|
|
@ -19,8 +19,22 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Сущность связи роли с разрешениями
|
||||
*/
|
||||
class ModuleRbac_EntityRolePermission extends EntityORM {
|
||||
|
||||
|
||||
/**
|
||||
* Выполняется перед сохранением
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function beforeSave() {
|
||||
if ($bResult=parent::beforeSave()) {
|
||||
if ($this->_isNew()) {
|
||||
$this->setDateCreate(date("Y-m-d H:i:s"));
|
||||
}
|
||||
}
|
||||
return $bResult;
|
||||
}
|
||||
|
||||
}
|
|
@ -19,8 +19,22 @@
|
|||
*
|
||||
*/
|
||||
|
||||
class ModuleRbac_EntityUserRole extends EntityORM {
|
||||
|
||||
|
||||
/**
|
||||
* Сущность связи роли с пользователям
|
||||
*/
|
||||
class ModuleRbac_EntityRoleUser extends EntityORM {
|
||||
/**
|
||||
* Выполняется перед сохранением
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function beforeSave() {
|
||||
if ($bResult=parent::beforeSave()) {
|
||||
if ($this->_isNew()) {
|
||||
$this->setDateCreate(date("Y-m-d H:i:s"));
|
||||
}
|
||||
}
|
||||
return $bResult;
|
||||
}
|
||||
|
||||
}
|
|
@ -27,11 +27,16 @@
|
|||
*/
|
||||
class ModuleRbac_MapperRbac extends Mapper {
|
||||
|
||||
|
||||
/**
|
||||
* Получает список всех задействованых в ролях разрешений
|
||||
*
|
||||
* @return array|null
|
||||
*/
|
||||
public function GetRoleWithPermissions() {
|
||||
$sql = "SELECT
|
||||
r.role_id,
|
||||
p.code,
|
||||
p.plugin,
|
||||
p.title,
|
||||
p.msg_error
|
||||
FROM
|
||||
|
@ -42,6 +47,6 @@ class ModuleRbac_MapperRbac extends Mapper {
|
|||
if ($aRows=$this->oDb->select($sql,ModuleRbac::PERMISSION_STATE_ACTIVE)) {
|
||||
return $aRows;
|
||||
}
|
||||
return null;
|
||||
return array();
|
||||
}
|
||||
}
|
|
@ -417,6 +417,10 @@ class ModuleUser extends Module {
|
|||
* Создаем персональный блог
|
||||
*/
|
||||
$this->Blog_CreatePersonalBlog($oUser);
|
||||
/**
|
||||
* Добавляем пользователю дефолтную роль для управления правами
|
||||
*/
|
||||
$this->Rbac_AddRoleToUser(Config::Get('module.user.rbac_role_default'),$oUser);
|
||||
return $oUser;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -155,6 +155,7 @@ $config['module']['user']['complaint_text_max'] = 2000; // Максимальн
|
|||
$config['module']['user']['complaint_type'] = array( // Список типов жалоб на пользователя
|
||||
'spam','obscene','other'
|
||||
);
|
||||
$config['module']['user']['rbac_role_default'] = 'user'; // Роль, которая автоматически назначается пользователю при регистрации
|
||||
|
||||
// Модуль Comment
|
||||
$config['module']['comment']['per_page'] = 20; // Число комментариев на одну страницу(это касается только полного списка комментариев прямого эфира)
|
||||
|
@ -310,7 +311,7 @@ $config['db']['table']['media_target'] = '___db.table.prefix___media_target'
|
|||
$config['db']['table']['rbac_role'] = '___db.table.prefix___rbac_role';
|
||||
$config['db']['table']['rbac_permission'] = '___db.table.prefix___rbac_permission';
|
||||
$config['db']['table']['rbac_role_permission']= '___db.table.prefix___rbac_role_permission';
|
||||
$config['db']['table']['rbac_user_role'] = '___db.table.prefix___rbac_user_role';
|
||||
$config['db']['table']['rbac_role_user'] = '___db.table.prefix___rbac_role_user';
|
||||
$config['db']['table']['storage'] = '___db.table.prefix___storage';
|
||||
$config['db']['table']['poll'] = '___db.table.prefix___poll';
|
||||
$config['db']['table']['poll_answer'] = '___db.table.prefix___poll_answer';
|
||||
|
|
|
@ -632,4 +632,27 @@ CREATE TABLE IF NOT EXISTS `prefix_cron_task` (
|
|||
|
||||
-- 17.08.2014
|
||||
INSERT INTO `prefix_cron_task` (`id`, `title`, `method`, `plugin`, `state`, `count_run`, `period_run`, `date_create`, `date_run_last`) VALUES (NULL, 'Отложенная отправка емайлов', 'Tools_SystemTaskNotify', '', '1', '0', '2', '2014-08-17 00:00:00', NULL);
|
||||
INSERT INTO `prefix_cron_task` (`id`, `title`, `method`, `plugin`, `state`, `count_run`, `period_run`, `date_create`, `date_run_last`) VALUES (NULL, 'Удаление старого кеша данных', 'Cache_ClearOldCache', '', '1', '0', '1500', '2014-08-17 00:00:00', NULL);
|
||||
INSERT INTO `prefix_cron_task` (`id`, `title`, `method`, `plugin`, `state`, `count_run`, `period_run`, `date_create`, `date_run_last`) VALUES (NULL, 'Удаление старого кеша данных', 'Cache_ClearOldCache', '', '1', '0', '1500', '2014-08-17 00:00:00', NULL);
|
||||
|
||||
-- 19.08.2014
|
||||
ALTER TABLE `prefix_rbac_permission` ADD `plugin` VARCHAR( 50 ) NOT NULL AFTER `code` ,
|
||||
ADD INDEX ( `plugin` );
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `prefix_rbac_group` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`code` varchar(50) NOT NULL,
|
||||
`title` varchar(250) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `code` (`code`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
ALTER TABLE `prefix_rbac_role_permission` DROP FOREIGN KEY `prefix_rbac_role_permission_ibfk_1` ;
|
||||
ALTER TABLE `prefix_rbac_user_role` DROP FOREIGN KEY `prefix_rbac_user_role_ibfk_2` ;
|
||||
ALTER TABLE `prefix_rbac_user_role` DROP FOREIGN KEY `prefix_rbac_user_role_ibfk_1` ;
|
||||
|
||||
ALTER TABLE `prefix_rbac_permission` ADD `group_id` INT NULL DEFAULT NULL AFTER `id` ,
|
||||
ADD INDEX ( `group_id` );
|
||||
ALTER TABLE `prefix_rbac_group` ADD `date_create` DATETIME NOT NULL ;
|
||||
RENAME TABLE `prefix_rbac_user_role` TO `prefix_rbac_role_user`;
|
||||
|
||||
INSERT INTO `prefix_rbac_role` (`id`, `pid`, `code`, `title`, `date_create`, `state`) VALUES (NULL, NULL, 'guest', 'Гость', '2014-08-22 00:00:00', '1'), (NULL, NULL, 'user', 'Пользователь', '2014-08-22 00:00:00', '1');
|
Loading…
Reference in a new issue