123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Administrator
- * Date: 2017/10/9
- * Time: 1:21
- */
- namespace backend\controllers;
- use backend\models\PermissionForm;
- use backend\models\RoleForm;
- use backend\models\AuthItem;
- use backend\models\AuthItemChild;
- use yii\data\Pagination;
- use yii\filters\AccessControl;
- use yii\rbac\Item;
- /**
- * 权限管理
- * @package backend\controllers
- */
- class AuthController extends BaseController
- {
- public $layout = 'iframe';
- const PAGESIZE = 20;
- public function behaviors()
- {
- return [
- 'access' => [
- 'class' => AccessControl::className(),
- 'rules' => [
- [
- 'actions' => [],
- 'allow' => true,
- 'roles' => ['@'],
- ],
- ],
- ],
- ];
- }
- /**
- * 添加角色
- * @return string|\yii\web\Response
- */
- public function actionAddRoles()
- {
- if(\Yii::$app->request->isPost){
- $name = \Yii::$app->request->post('name');
- $description = \Yii::$app->request->post('description');
- if ((!empty($name)) && (!empty($description))) {
- self::createRole($name, $description);
- \Yii::$app->getSession()->setFlash('success', '创建角色成功!');
- return $this->redirect(['auth/roles']);
- } else {
- \Yii::$app->getSession()->setFlash('error', '创建角色失败!');
- // return $this->redirect(['auth/addroles']);
- }
- }
- return $this->render('addroles');
- }
- /**
- * 角色列表
- */
- public function actionRoles()
- {
- $model = AuthItem::find()->where(['type' => 1]);
- $pages = new Pagination(["totalCount" => $model->count(), "pageSize" => self::PAGESIZE]);
- $model = $model->offset($pages->offset)->limit($pages->pageSize)->all();
- return $this->render('roleslist', [
- 'model' => $model, 'pages' => $pages
- ]);
- }
- /**
- * 生成角色
- */
- private static function createRole($roles, $description)
- {
- $auth = \Yii::$app->authManager;
- $role = $auth->createRole($roles);
- $role->description = $description;
- return $auth->add($role);
- }
- /**
- * 删除角色
- * @return string
- */
- public function actionDelRoles()
- {
- $name = \Yii::$app->request->post('name');
- $authManager = \Yii::$app->authManager;
- $role = $authManager->getRole($name);
- if (!$role) {
- return json_encode([
- "status" => 2,
- "msg" => '角色不存在'
- ]);
- } else {
- $result = $authManager->getUserIdsByRole($name);
- if(empty($result)){
- if ($authManager->remove($role)) {
- return json_encode([
- "status" => 1,
- "msg" => '角色删除成功'
- ]);
- } else {
- return json_encode([
- "status" => 3,
- "msg" => '角色删除失败'
- ]);
- }
- }else{
- return json_encode([
- "status" => 0,
- "msg" => '该角色有与用户绑定,请先解绑再删除'
- ]);
- }
- }
- }
- /**
- * 修改角色
- * @param null $userid
- * @return string|\yii\web\Response
- */
- public function actionRoleUpdate($userid = NULL)
- {
- $name = \Yii::$app->request->get('name');
- $authManager = \Yii::$app->authManager;
- $role = $authManager->getRole($name);
- if (!$role) {
- \Yii::$app->getSession()->setFlash('error', '角色不存在!');
- return $this->redirect(['auth/roles']);
- }
- if (\Yii::$app->request->isPost) {
- $rolemodel = AuthItem::find()->where('type =:type and name = :name', [':type' => Item::TYPE_ROLE, ':name' => $name])->one();
- $rolemodel->description = \Yii::$app->request->post('RoleForm')['description'];
- if ($rolemodel->validate() && $rolemodel->save()) {
- \Yii::$app->getSession()->setFlash('success', '修改成功!');
- return $this->redirect(['auth/roles']);
- } else {
- \Yii::$app->getSession()->setFlash('error', '修改失败!');
- return $this->redirect(['auth/roles']);
- }
- } else {
- $model = new RoleForm();
- // //角色名称
- $model->name = $role->name;
- $model->description = $role->description;
- return $this->render('updateroles', [
- 'model' => $model,
- 'uid' => $userid
- ]);
- }
- }
- /**
- * 初始化权限
- * @return string
- */
- public function actionCreateAll(){
- $cont=\Yii::$app->request->post('cont','');
- $list = [];
- if(empty($cont)){
- $FileArray = $this->getControllers();
- foreach ($FileArray as $file){
- if($file != 'SiteController.php') { //过滤Site
- $method = $this->getMethodList('backend\\controllers\\' . strstr($file, '.', true));
- $list[] = $method;
- }
- }
- }else{
- $list[] = $this->getMethodList('backend\\controllers\\'.$cont);
- }
- $authManager =\Yii::$app->authManager;
- foreach ($list as $data){
- $name = $data['name'];
- $description= $data['comment'];
- foreach ($data['method'] as $method){
- $per = $authManager->getPermission($name.'::'.$method['name']);
- if(!$per){
- self::createPermission($data['name'] .'::'.$method['name'],$method['comment']);
- }
- }
- }
- return json_encode([
- "status" => 1,
- "msg" =>'创建成功'
- ]);
- }
- /**
- * 控制器列表
- * @return array
- */
- private function getControllers(){
- $Dir = \Yii::getAlias('@backend').'/controllers/';
- $fileArray = [];
- if( is_dir($Dir) ) {
- if (false != ($Handle = opendir($Dir))) {
- while (false != ($File = readdir($Handle))) {
- if ($File != '.' && $File != '..' && strpos($File, '.')) {
- $fileArray[] = $File;
- }
- }
- closedir($Handle);
- }
- }
- return $fileArray;
- }
- /**
- * 权限列表
- */
- public function actionPermission()
- {
- $keyword = \Yii::$app->request->get('keyword');
- $datas = AuthItem::find()->where(['type' => 2]);
- if(!empty($keyword)){
- $datas->andWhere('description like :keyword',[':keyword'=>'%'.$keyword.'%']);
- }
- $pages = new Pagination(["totalCount" => $datas->count(), "pageSize" => self::PAGESIZE]);
- $datas = $datas->offset($pages->offset)->limit($pages->pageSize)->all();
- return $this->render('permissionlist', [
- 'datas' => $datas, 'pages' => $pages
- ]);
- }
- /**
- * 创建权限
- * @return string
- */
- public function actionAddPermission()
- {
- $name = \Yii::$app->request->post('prename');
- $description = \Yii::$app->request->post('description');
- if ((!empty($name)) && (!empty($description))) {
- $authManager = \Yii::$app->authManager;
- $per = $authManager->getPermission($name);
- if ($per) {
- return json_encode([
- "status" => 3,
- "msg" => '该权限已创建'
- ]);
- } else {
- self::createPermission($name, $description);
- return json_encode([
- "status" => 1,
- "msg" => '创建成功'
- ]);
- }
- } else {
- return json_encode([
- "status" => 2,
- "msg" => '创建失败'
- ]);
- }
- }
- /**
- * 修改权限
- */
- public function actionUpdateper()
- {
- $cont = $this->getControllers();
- $name = \Yii::$app->request->get('name');
- $authManager = \Yii::$app->authManager;
- $per = $authManager->getPermission($name);
- if (!$per) {
- \Yii::$app->getSession()->setFlash('error', '修改失败,权限不存在!');
- return $this->redirect(['auth/permission']);
- }
- $model = new PermissionForm();
- $model->name = $per->name;
- $model->description = $per->description;
- // //权限表单
- // $model = new PermissionForm();
- // //权限名称
- // $model->name = $per->name;
- // //权限描述
- // $model->description = $per->description;
- // $contname = explode('::', $model->name);
- // if ($model->load(\Yii::$app->request->post())) {
- // $newname = \Yii::$app->request->post('PermissionForm')['name'];
- // if ($model->update($newname)) {
- // \Yii::$app->getSession()->setFlash('success', '修改成功!');
- // return $this->redirect(['auth/add-permission']);
- // } else {
- // \Yii::$app->getSession()->setFlash('error', '修改失败!');
- // return $this->redirect(['auth/add-permission']);
- // }
- //
- // } else {
- // return $this->render('updateper', [
- // 'model' => $model,
- // ]);
- // }
- if(\Yii::$app->request->isPost){
- //只修改权限名称
- $description = \Yii::$app->request->post('PermissionForm')['description'];
- $row = AuthItem::updateAll(['description'=>$description],['type'=>2,'name'=>$name]);
- if ($row) {
- \Yii::$app->getSession()->setFlash('success', '修改成功!');
- return $this->redirect(['auth/permission']);
- } else {
- \Yii::$app->getSession()->setFlash('error', '修改失败!');
- return $this->redirect(['auth/add-permission']);
- }
- }
- return $this->render('updateper', [
- 'model' => $model,
- ]);
- }
- /**
- * 删除权限
- */
- public function actionDelPermission()
- {
- $name = \Yii::$app->request->post('name');
- $authManager = \Yii::$app->authManager;
- $per = $authManager->getPermission($name);
- if (!$per) {
- return json_encode([
- "status" => 2,
- "msg" => '权限不存在'
- ]);
- } else {
- if ($authManager->remove($per)) {
- return json_encode([
- "status" => 0,
- "msg" => '权限删除成功'
- ]);
- } else {
- return json_encode([
- "status" => 3,
- "msg" => '权限删除失败'
- ]);
- }
- }
- }
- /**
- * 角色赋予权限
- * @param $name
- * @param $userid
- * @return string
- */
- public function actionRoleNode($name, $userid = NULL)
- {
- /**
- * 1.根据提交的数据,先删除当前角色下的当前模块下选择取消的角色权限关联
- * 2.新增提交过来的角色与权限管理
- */
- $authManager = \Yii::$app->authManager;
- $role = $authManager->getRole($name);
- if (!$role) {
- \Yii::$app->getSession()->setFlash('error', '角色不存在!');
- return $this->redirect(['auth/roles']);
- }
- if (\Yii::$app->request->isPost) {
- $nodes = \Yii::$app->request->post('permission');
- // $authManager->removeChildren($role);
- $nodeArray = [];
- if ($nodes) {
- foreach ($nodes as $v) {
- $node = $authManager->getPermission($v);
- if (!empty($node) && !$authManager->hasChild($role,$node)){
- $authManager->addChild($role, $node);
- };
- $nodeArray[] = $v;
- }
- }
- $roleNodes =
- //清除未选择中的权限绑定
- $datas = AuthItemChild::find()->where(['and',['parent'=>$name],['not in','child',$nodeArray]])->all();
- foreach($datas as $data){
- if(!in_array($data->child,$nodeArray)){
- $node = $authManager->getPermission($data->child);
- $authManager->removeChild($role,$node);
- }
- }
- if ($userid) {
- return $this->redirect(['auth/index']);
- } else {
- \Yii::$app->getSession()->setFlash('success', '成功添加权限!');
- return $this->redirect(['auth/roles']);
- }
- }
- $roleNodes = $authManager->getPermissionsByRole($name);
- $roleNodes = array_keys($roleNodes);
- $nodes = $authManager->getPermissions();
- $nodesList = [];
- foreach ($nodes as $node){
- $contname = strstr($node->name,'::',true);
- if(!isset($nodesList[$contname])){
- $class = new \ReflectionClass('backend\\controllers\\'.$contname);
- $nodesList[$contname]['name'] = $this->getComment($class);
- }
- $nodesList[$contname]['methods'][] = $node;
- }
- return $this->render('rolenode', [
- 'nodes' => $nodesList,
- 'roleNodes' => $roleNodes,
- 'name' => $name,
- 'uid' => $userid,
- ]);
- }
- /**
- * 用户赋予角色(单个)
- * @param $userid
- * @param $rolename
- * @return bool
- */
- public static function userRole($userid,$rolename){
- $auth = \Yii::$app->getAuthManager();
- $role = $auth->getRolesByUser($userid);
- if(!empty($role) && current($role)->name == $rolename){
- return true;
- }
- $role = $auth->getRole($rolename);
- if(empty($role)){
- return false;
- }
- $auth->revokeAll($userid); //清空绑定
- $auth->assign($role,$userid); //绑定
- return true;
- }
- // /**
- // * 用户赋予角色
- // */
- // public function actionRole()
- // {
- // //从用户跳转过来,目的获取用户id
- // $uid = \Yii::$app->request->get('uid');
- // $admin = User::find()->where(['id' => $uid])->one();
- // if (!$admin) {
- // \Yii::$app->getSession()->setFlash('error', '用户未找到!');
- // }
- // $authManager = \Yii::$app->authManager;
- // if (\Yii::$app->request->isPost) {
- // $roleNames = \Yii::$app->request->post('roles');
- // $authManager->revokeAll($uid);
- // if (!empty($roleNames) && is_array($roleNames)) {
- // foreach ($roleNames as $roleName) {
- // $role = $authManager->getRole($roleName);
- // if (!$role) {
- // continue;
- // }
- // $authManager->assign($role, $uid);
- // }
- // }
- // if ($roleNames) {
- // $admin->role = implode(',', $roleNames);
- // }
- //
- // if ($admin->update()) {
- // \Yii::$app->getSession()->setFlash('success', '更新成功!');
- // return $this->redirect(['auth/index']);
- // } else {
- // \Yii::$app->getSession()->setFlash('success', '更新失败!');
- // return $this->redirect(['auth/role', 'uid' => $uid]);
- // }
- // } else {
- // $userRoles = $authManager->getRolesByUser($uid);
- //
- // $roleNames = ArrayHelper::getColumn(ArrayHelper::toArray($userRoles), 'name');
- // $roles = $authManager->getRoles();
- // return $this->render('role', ['roles' => $roles, 'roleNames' => $roleNames, 'uid' => $uid]);
- // }
- // }
- /**
- * 权限验证
- * @param $level
- * @return bool
- */
- static function checkPermission($level)
- {
- $level = 1;
- $role = \Yii::$app->user->identity->role;
- if ($level <= $role) {
- return true;
- } else {
- return false;
- }
- }
- /**
- * 创建权限
- */
- static function createPermission($name, $description)
- {
- $auth = \Yii::$app->authManager;
- $createPost = $auth->createPermission($name);
- $createPost->description = $description;
- $auth->add($createPost);
- }
- /**
- * 获取类中可访问方法及注释
- * @param $classname
- * @return array
- */
- private function getMethodList($classname){
- $class = new \ReflectionClass($classname);
- $methods = $class->getMethods(\ReflectionMethod::IS_PUBLIC);
- $classMap = [];
- $classMap['name'] = $class->getShortName();
- $classMap['comment'] = $this->getComment($class);
- $classMap['method'] = [];
- foreach ($methods as $method){
- if(strlen($method->name) > 7 && substr($method->name,0,6) == 'action'){
- $temp['name'] = $method->getName();
- $temp['comment'] = $this->getComment($method);
- $classMap['method'][] = $temp;
- }
- }
- return $classMap;
- }
- /**
- * 提取注释
- * @param $reflection
- * @return string
- */
- private function getComment($reflection){
- $comment = strtr(trim(preg_replace('/^\s*\**( |\t)?/m', '', trim($reflection->getDocComment(), '/'))), "\r", '');
- if (preg_match('/^\s*@\w+/m', $comment, $matches, PREG_OFFSET_CAPTURE)) {
- $comment = trim(substr($comment, 0, $matches[0][1]));
- }
- return $comment;
- }
- }
|