You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
237 lines
6.8 KiB
237 lines
6.8 KiB
<?php |
|
/** |
|
* Created by Error202 |
|
* Date: 13.08.2017 |
|
*/ |
|
|
|
namespace core\services; |
|
|
|
use DomainException; |
|
use Exception; |
|
use ReflectionException; |
|
use yii\helpers\ArrayHelper; |
|
use yii\rbac\ManagerInterface; |
|
use yii\rbac\Role; |
|
use yii\helpers\Json; |
|
|
|
class RoleManager |
|
{ |
|
private ManagerInterface $manager; |
|
|
|
public function __construct(ManagerInterface $manager) |
|
{ |
|
$this->manager = $manager; |
|
} |
|
|
|
/** |
|
* @param $userId |
|
* @param $name |
|
* @throws Exception |
|
*/ |
|
public function assign($userId, $name) |
|
{ |
|
$am = $this->manager; |
|
$am->revokeAll($userId); |
|
if (!$role = $am->getRole($name)) { |
|
throw new DomainException('Role "' . $name . '" does not exist.'); |
|
} |
|
$am->revokeAll($userId); |
|
$am->assign($role, $userId); |
|
} |
|
|
|
/** |
|
* @param $name |
|
* @param string $description |
|
* @param null $ruleName |
|
* @param null $data |
|
* @throws Exception |
|
*/ |
|
public function create($name, $description = '', $ruleName = null, $data = null) |
|
{ |
|
$am = $this->manager; |
|
if ($role = $am->getRole($name)) { |
|
throw new DomainException('Role "' . $name . '" is already exist.'); |
|
} |
|
$newRole = $am->createRole($name); |
|
$newRole->description = $description; |
|
$newRole->data = $data == null ? null : Json::decode($data); |
|
$newRole->ruleName = empty($ruleName) ? null : $ruleName; |
|
try { |
|
$am->add($newRole); |
|
} |
|
catch (ReflectionException $e) { |
|
throw new DomainException($e->getMessage()); |
|
} |
|
} |
|
|
|
/** |
|
* @param $name |
|
* @param $newName |
|
* @param string $description |
|
* @param null $ruleName |
|
* @param null $data |
|
* @throws Exception |
|
*/ |
|
public function update($name, $newName, $description = '', $ruleName = null, $data = null) |
|
{ |
|
$am = $this->manager; |
|
if (!$role = $am->getRole($name)) { |
|
throw new DomainException('Role "' . $name . '" does not exist.'); |
|
} |
|
if (($name == 'admin' || $name == 'user') && $name != $newName) { |
|
throw new DomainException('Role "' . $name . '" can not be renamed.'); |
|
} |
|
$role->name = $newName; |
|
$role->description = $description; |
|
$role->ruleName = empty($ruleName) ? null : $ruleName; |
|
$role->data = $data == null ? null : Json::decode($data); |
|
try { |
|
$am->update($name, $role); |
|
} |
|
catch (ReflectionException $e) { |
|
throw new DomainException($e->getMessage()); |
|
} |
|
} |
|
|
|
public function delete($name) |
|
{ |
|
$am = $this->manager; |
|
if (!$role = $am->getRole($name)) { |
|
throw new DomainException('Role "' . $name . '" does not exist.'); |
|
} |
|
if ($role->name == 'admin' || $role->name == 'user') { |
|
throw new DomainException('Can not delete role "' . $name . '"'); |
|
} |
|
$am->remove($role); |
|
} |
|
|
|
/** |
|
* @param $parentRoleName |
|
* @param $childRoleName |
|
* @throws \yii\base\Exception |
|
*/ |
|
public function child($parentRoleName, $childRoleName) |
|
{ |
|
$am = $this->manager; |
|
if (!$parentRole = $am->getRole($parentRoleName)) { |
|
throw new DomainException('Parent role "' . $parentRoleName . '" does not exist.'); |
|
} |
|
if (!$childRole = $am->getRole($childRoleName)) { |
|
throw new DomainException('Child role "' . $childRoleName . '" does not exist.'); |
|
} |
|
if ($parentRoleName == $childRoleName) { |
|
throw new DomainException('Can not add a role to yourself.'); |
|
} |
|
$am->addChild($parentRole, $childRole); |
|
} |
|
|
|
public function killchild($parentRoleName, $childRoleName) |
|
{ |
|
$am = $this->manager; |
|
if (!$parentRole = $am->getRole($parentRoleName)) { |
|
throw new DomainException('Parent role "' . $parentRoleName . '" does not exist.'); |
|
} |
|
if (!$childRole = $am->getRole($childRoleName)) { |
|
throw new DomainException('Child role "' . $childRoleName . '" does not exist.'); |
|
} |
|
if ($parentRoleName == $childRoleName) { |
|
throw new DomainException('Can not kill yourself as child.'); |
|
} |
|
if (!$am->hasChild($parentRole, $childRole)) { |
|
throw new DomainException('Role "' . $childRoleName . '" does not assigned to "' . $parentRoleName . '".'); |
|
} |
|
$am->removeChild($parentRole, $childRole); |
|
} |
|
|
|
public function getRoles(): array |
|
{ |
|
$am = $this->manager; |
|
return $am->getRoles(); |
|
} |
|
|
|
public function getRole($name): ?Role |
|
{ |
|
$am = $this->manager; |
|
if (!$role = $am->getRole($name)) { |
|
throw new DomainException('Role "' . $name . '" does not exist.'); |
|
} |
|
return $role; |
|
} |
|
|
|
public function getChildRoles($name): array |
|
{ |
|
$am = $this->manager; |
|
return $am->getChildRoles($name); |
|
} |
|
|
|
public function getRolesNamesByUser($id): array |
|
{ |
|
$am = $this->manager; |
|
$roles = $am->getRolesByUser($id); |
|
return array_map(function(Role $role){ |
|
return $role->name; |
|
}, $roles); |
|
} |
|
|
|
public function getRolesListArray(): array |
|
{ |
|
$data = array_map(function (Role $role){ |
|
return [ |
|
'name' => $role->name, |
|
'description' => $role->description, |
|
]; |
|
}, $this->getRoles()); |
|
return $data; |
|
} |
|
|
|
public function getRolesSelectArray(): array |
|
{ |
|
return ArrayHelper::map($this->getRoles(), 'name', 'description'); |
|
} |
|
|
|
public function getRolesSelectArrayByRole($id): array |
|
{ |
|
$am = $this->manager; |
|
return ArrayHelper::getColumn($am->getChildRoles($id), 'name'); |
|
} |
|
|
|
/** |
|
* @param $roleName |
|
* @param $rolesNames |
|
* @param $permissionNames |
|
* @throws \yii\base\Exception |
|
*/ |
|
public function saveChildren($roleName, $rolesNames, $permissionNames) |
|
{ |
|
$am = $this->manager; |
|
$role = $am->getRole($roleName); |
|
$am->removeChildren($role); |
|
|
|
if (is_array($rolesNames) && !empty($rolesNames)) { |
|
foreach ($rolesNames as $name) { |
|
$childRole = $am->getRole($name); |
|
$am->addChild($role, $childRole); |
|
} |
|
} |
|
|
|
if (is_array($permissionNames) && !empty($permissionNames)) { |
|
foreach ($permissionNames as $name) { |
|
$childPermission = $am->getPermission($name); |
|
$am->addChild($role, $childPermission); |
|
} |
|
} |
|
} |
|
|
|
public static function getCurrentRoleName(): ?string |
|
{ |
|
$roles = \Yii::$app->authManager->getRolesByUser(\Yii::$app->user->id); |
|
if (!$roles) { |
|
return null; |
|
} |
|
reset($roles); |
|
/* @var $role Role */ |
|
$role = current($roles); |
|
|
|
return $role->name; |
|
} |
|
} |