authManager = \Yii::$app->getAuthManager(); } public function getSearchModel(array $options = []) { throw new Exception("Not need"); } public function getModel($id, array $options = []) { throw new Exception("Not need"); } public function newModel(array $options = []) { throw new Exception("Not need"); } public function getNewPermissionModel() { return new RBACPermissionForm(); } public function getPermissionSearchModel(array $options = []) { return new RBACPermissionSearch(); } public function getPermissionList(array $query = []) { $items = $this->authManager->getPermissions(); $permissions = []; foreach ($items as $item){ $model = new RBACPermissionForm(); $model->setAttributes($item); $permissions[] = $model->getAttributes(); } ArrayHelper::multisort($permissions, 'sort'); $searchModel = $this->getPermissionSearchModel(); $dataProvider = $searchModel->search($query, ['permissions' => $permissions]); return [ 'dataProvider' => $dataProvider, 'searchModel' => $searchModel, ]; } public function createPermission(array $postData = []) { $formModel = $this->getNewPermissionModel(); if ( !$formModel->load($postData) ){ return $formModel; } if ($this->authManager->getPermission($formModel->name) !== null) { $formModel->addError('route', Yii::t('app', 'Permission exists')); $formModel->addError('method', Yii::t('app', 'Permission exists')); return false; } $permission = $this->authManager->createPermission($formModel->getName()); $permission->description = $formModel->description; $permission->data = $formModel->getData(); if( $this->authManager->add($permission) ){ Event::trigger(CustomLog::className(), CustomLog::EVENT_CUSTOM, new CustomLog([ 'sender' => $formModel, 'description' => "创建 权限 (" . $formModel->getName() . ") " . print_r($formModel->getAttributes(), true), ])); return true; } return false; } public function getPermissionDetail($name) { $permission = $this->authManager->getPermission($name); $formModel = new RBACPermissionForm(); $formModel->setAttributes($permission); return $formModel; } public function updatePermission($name, array $postData = []) { $formModel = $this->getNewPermissionModel(); if ( !$formModel->load($postData) ){ return $formModel->getErrors(); } $oldPermission = $this->getPermissionDetail($name); $permission = $this->authManager->createPermission($formModel->getName()); $permission->description = $formModel->description; $permission->data = $formModel->getData(); if( $this->authManager->update($name, $permission) ){ Event::trigger(CustomLog::className(), CustomLog::EVENT_CUSTOM, new CustomLog([ 'sender' => $formModel, 'description' => "修改 权限(" . $name . ") 从" . print_r($oldPermission, true) . "变更为" . print_r($formModel->getAttributes(), true), ])); return true; } return false; } public function deletePermission($name) { $permission = $this->authManager->createPermission($name); $result = $this->authManager->remove($permission); if( $result ){ Event::trigger(CustomLog::className(), CustomLog::EVENT_CUSTOM, new CustomLog([ 'sender' => $this, 'description' => "删除 权限(" . $name . ")", ])); } return $result; } public function sortPermission($name, $sort) { $permission = $this->authManager->getPermission($name); $formModel = $this->getNewPermissionModel(); $formModel->setAttributes($permission); $oldSort = $formModel->sort; $formModel->sort = $sort; $permission->data = $formModel->getData(); $result = $this->authManager->update($name, $permission); if($result){ Event::trigger(CustomLog::className(), CustomLog::EVENT_CUSTOM, new CustomLog([ 'sender' => $this, 'description' => "修改 权限(" . $name . ") 排序 " . $oldSort . "为" . $sort, ])); } return $result; } public function getNewRoleModel() { return new RBACRoleForm(); } public function getRoleSearchModel(array $options=[]) { return new RBACRoleSearch(); } public function getRoleList(array $query = []) { $items = $this->authManager->getRoles(); $roles = []; foreach ($items as $item) { $model = new RBACRoleForm(); $model->setAttributes($item); $roles[] = $model->getAttributes(); } ArrayHelper::multisort($roles, 'sort'); $searchModel = $this->getRoleSearchModel(); $dataProvider = $searchModel->search($query, ['roles'=>$roles]); return [ 'dataProvider' => $dataProvider, 'searchModel' => $searchModel, ]; } public function createRole(array $postData = []) { $formModel = $this->getNewRoleModel(); if ( !$formModel->load($postData) ){ return $formModel->getErrors(); } if ($this->authManager->getRole($formModel->name) !== null) { $formModel->addError('name', Yii::t('app', 'Role exists')); return false; } $role = $this->authManager->createRole($formModel->name); $role->description = $formModel->description; $role->data = $formModel->getData(); if( $this->authManager->add($role) ){ //add role's permission $permissions = $formModel->getPermissions(); foreach ($permissions as $permissionName){ $permissionItem = $this->authManager->getPermission($permissionName); if( $permissionItem === null ) { throw new Exception("Not existed permission name " . $permissionName); } $result = $this->authManager->addChild($role, $permissionItem); if(!$result){ return false; } } //add roles's child role $childRoles = $formModel->getRoles(); foreach ($childRoles as $needAddChildRole){ $childRole = $this->authManager->getRole($needAddChildRole); $result = $this->authManager->addChild($role, $childRole); if(!$result){ return false; } } Event::trigger(CustomLog::className(), CustomLog::EVENT_CUSTOM, new CustomLog([ 'sender' => $formModel, 'description' => "创建角色 (" . $formModel->name . ") 权限为 " . print_r($permissions, true) . " 继承角色 " . print_r($childRoles, true) . "的权限" ])); return true; } return false; } public function getRoleDetail($name) { $role = $this->authManager->getRole($name); $formModel = new RBACRoleForm(); $formModel->setAttributes($role); $formModel->setPermissions( $this->authManager->getPermissionsByRole($name) ); $formModel->setRoles( $this->authManager->getChildRoles($name) ); return $formModel; } public function updateRole($name, array $postData = []) { $formModel = $this->getNewRoleModel(); if ( !$formModel->load($postData) ){ return $formModel->getErrors(); } $role = $this->authManager->getRole($name); if( $name != $formModel->name ){//修改角色名称 if( $this->authManager->getRole($formModel->name) !== null ){ return Yii::t('app', 'Role exists'); } } $role->name = $formModel->name; $role->description = $formModel->description; $role->data = $formModel->getData(); $oldPermissions = array_keys( $this->authManager->getPermissionsByRole($name) ); $oldRoles = array_keys($this->authManager->getChildRoles($name)); if( $this->authManager->update($name, $role) ){ $permissions = $formModel->getPermissions(); $needAdds = array_diff($permissions, $oldPermissions); foreach ($needAdds as $permission){ $permission = $this->authManager->getPermission($permission); $this->authManager->addChild($role, $permission); } $needRemoves = array_diff($oldPermissions, $formModel->getPermissions()); foreach ($needRemoves as $permission){ $permission = $this->authManager->getPermission($permission); $this->authManager->removeChild($role, $permission); } $roles = $formModel->getRoles(); $needAdds = array_diff($roles, $oldRoles); foreach ($needAdds as $needAdd){ $needAdd = $this->authManager->getRole($needAdd); $this->authManager->addChild($role, $needAdd); } $needRemoves = array_diff($oldRoles, $formModel->getRoles()); foreach ($needRemoves as $needRemove){ $needRemove = $this->authManager->getRole($needRemove); if( !$needRemove ) continue; $this->authManager->removeChild($role, $needRemove); } Event::trigger(CustomLog::className(), CustomLog::EVENT_CUSTOM, new CustomLog([ 'sender' => $this, 'description' => "修改 角色 (" . $name . ") 把权限从" . print_r($oldPermissions, true) . " 修改为 " . print_r($permissions, true) . " 把子角色从 " . print_r($oldRoles, true) . " 修改为 " . print_r($roles, true), ])); return true; } return false; } public function sortRole($name, $sort) { $role = $this->authManager->getRole($name); if( $role === null ) throw new NotFoundHttpException("Not exits role " . $name); $formModel = $this->getNewRoleModel(); $formModel->setAttributes($role); $oldSort = $formModel->sort; $formModel->sort = $sort; $role->data = $formModel->getData(); $result = $this->authManager->update($name, $role); if($result){ Event::trigger(CustomLog::className(), CustomLog::EVENT_CUSTOM, new CustomLog([ 'sender' => $this, 'description' => "修改 角色(" . $name . ")排序 " . $oldSort . "为" . $formModel->sort, ])); } return $result; } public function deleteRole($name) { $role = $this->authManager->getRole($name); if( $role === null ) throw new NotFoundHttpException("Not exits role " . $name); $permissions = $this->authManager->getPermissionsByRole($name); foreach ($permissions as $permission){ $result = $this->authManager->remove($permission); if( !$result ){ Yii::error("delete role remove permission " . $permission->name . " error"); } } $result = $this->authManager->remove($role); if($result){ Event::trigger(CustomLog::className(), CustomLog::EVENT_CUSTOM, new CustomLog([ 'sender' => $this, 'description' => "删除 角色(" . $name . ")", ])); } return $result; } public function getRoles() { $roles = []; foreach (array_keys($this->authManager->getRoles()) as $key){ $roles[$key] = $key; } return $roles; } public function getPermissionsGroups() { $authManager = $this->authManager; $originPermissions = $authManager->getPermissions(); $permissions = []; foreach ($originPermissions as $originPermission){ $data = json_decode($originPermission->data, true); $temp = explode(":", $originPermission->name); $permissions[] = [ 'name' => $originPermission->name, 'route' => $temp[0], 'method' => $temp[1], 'description' => $originPermission->description, 'group' => $data['group'], 'category' => $data['category'], 'sort' => $data['sort'], ]; } ArrayHelper::multisort($permissions, 'sort'); $data = []; foreach ($permissions as $permission){ $data[$permission['group']][$permission['category']][] = $permission; } return $data; } public function getPermissionGroups() { $permissions = $this->getPermissionsGroups(); $groups = array_keys($permissions); $newGroups = []; foreach ($groups as $group){ $newGroups[$group] = $group; } return $newGroups; } public function getPermissionCategories() { $permissions = $this->getPermissionsGroups(); $categories = []; foreach ($permissions as $permission){ $categories = array_merge($categories, array_keys($permission)); } $newCategories = []; foreach ($categories as $category){ $newCategories[$category] = $category; } return $newCategories; } public function newAssignPermissionModel() { return new AssignPermissionForm(); } public function getAssignPermissionDetail($userId) { $model = $this->newAssignPermissionModel(); $tempPermissions = array_keys($this->authManager->getPermissionsByUser($userId)); $permissions = []; foreach ($tempPermissions as $permission){ $permissions[$permission] = $permission; } $data = [ 'roles' => array_keys($this->authManager->getRolesByUser($userId)), 'permissions' => $permissions, ]; $model->setAttributes($data); return $model; } public function assignPermission($postData, $userId) { $model = new AssignPermissionForm(); if( !$model->load($postData) ){ return $model; } $authManager = $this->authManager; $assignments = $authManager->getAssignments($userId); $roles = $permissions = []; foreach ($assignments as $key => $assignment){ if( strpos($assignment->roleName, ':GET') || strpos($assignment->roleName, ':POST') || strpos($assignment->roleName, ':DELETE') ){ $permissions[$key] = $assignment; }else{ $roles[$key] = $assignment; } } $roles = array_keys($roles); $permissions = array_keys($permissions); $str = ''; //角色roles $needAdds = array_diff($model->getRoles(), $roles); $needRemoves = array_diff($roles, $model->getRoles()); if( !empty($needAdds) ) { $str .= " 增加了角色: "; foreach ($needAdds as $role) { $roleItem = $authManager->getRole($role); $authManager->assign($roleItem, $userId ); $str .= " {$roleItem->name},"; } } if( !empty($needRemoves) ) { $str .= ' 删除了角色: '; foreach ($needRemoves as $role) { $roleItem = $authManager->getRole($role); $authManager->revoke($roleItem, $userId); $str .= " {$roleItem->name},"; } } //权限permission $needAdds = array_diff($model->getPermissions(), $permissions); $needRemoves = array_diff($permissions, $model->getPermissions()); if( !empty($needAdds) ) { $str .= ' 增加了权限: '; foreach ($needAdds as $permission) { $permissionItem = $authManager->getPermission($permission); $authManager->assign($permissionItem, $userId); $str .= " {$permissionItem->name},"; } } if( !empty($needRemoves) ) { $str .= ' 删除了权限: '; foreach ($needRemoves as $permission) { $permissionItem = $authManager->getPermission($permission); $authManager->revoke($permissionItem, $userId); $str .= " {$permissionItem->name},"; } } Event::trigger(CustomLog::className(), CustomLog::EVENT_CUSTOM, new CustomLog([ 'sender' => $this, 'description' => "修改了 用户(uid {$userId}) 的权限: {$str}", ])); return true; } }