فهرست منبع

修改菜单,权限

root 2 سال پیش
والد
کامیت
3cfcb38f68

+ 2 - 2
backendApi/config/menu.php

@@ -17,7 +17,7 @@ return [
         'controller'=>'dashboard',
         'action'=>'index',
         'routePath'=>'dashboard/index',
-        "schemaApi" => "/v1/oauth/page?code=homeDemo",
+        "schemaApi" => "homeDemo",
         'show'=>1,
         'child'=>[
 //            ['name'=>'总累计', 'class'=>'', 'icon'=>'', 'controller'=>'dashboard', 'action'=>'total-item', 'routePath'=>'dashboard/total-item', 'show'=>0,],
@@ -35,7 +35,7 @@ return [
         'routePath'=>'shop',
         'show'=>1,
         'child'=>[
-            [ "schemaApi" => "/v1/oauth/page?code=productList",'name'=>'Products list', 'class'=>'', 'icon'=>'', 'controller'=>'shop', 'action'=>'index', 'routePath'=>'shop/index', 'show'=>1,],//商品列表
+            [ "schemaApi" => "productList",'name'=>'Products list', 'class'=>'', 'icon'=>'', 'controller'=>'shop', 'action'=>'index', 'routePath'=>'shop/index', 'show'=>1,],//商品列表
             // 新添加的商品操作  --- stat
             ['name'=>'添加商品', 'class'=>'', 'icon'=>'', 'controller'=>'shop', 'action'=>'goods-add', 'routePath'=>'shop/goods-add', 'show'=>0,],
             ['name'=>'编辑商品', 'class'=>'', 'icon'=>'', 'controller'=>'shop', 'action'=>'goods-edit', 'routePath'=>'shop/goods-edit', 'show'=>0,],

+ 2 - 6
backendApi/config/params.php

@@ -3,11 +3,8 @@ return [
     'adminEmail' => 'admin@example.com',
     'noCheckTokenActions' => [
         //新版测试---开始
-        'v1/oauth/testmenu',
-        'v1/oauth/page',
+        
         //新版测试---结束
-
-
         'v1/oauth/login', 
         'v1/oauth/no-login-modify-password', 
         'v1/oauth/refresh-access-token', 
@@ -20,8 +17,7 @@ return [
     ],
     'noCheckPermissionActions' => [
         //新版测试---开始
-        'oauth/testmenu',
-        'oauth/page',
+        'oauth/system-menu',
         //新版测试---结束
 
         'oauth/login', 

+ 1 - 1
backendApi/config/urlManagerRules.php

@@ -235,7 +235,7 @@ return [
         'extraPatterns' => [
             //新版测试---开始
             'POST,GET page' => 'page',
-            'POST,GET testmenu' => 'testmenu',
+            'POST,GET system-menu' => 'system-menu',
             //新版测试---结束
             'GET menu' => 'menu',
             'POST login' => 'login',

+ 35 - 0
backendApi/modules/v1/controllers/BaseController.php

@@ -61,11 +61,46 @@ class BaseController extends \yii\rest\ActiveController {
 
         // 校验用户权限
         if (!Yii::$app->user->validateAdminAction($this->id, $this->action->id)) {
+            // 兼容处理,拉取页面的权限使用menu的权限来判断
+            if ($this->id == 'oauth' && $this->action->id == 'page') {
+                $request = Yii::$app->request;
+                $sqlCode = $request->get('code', '');// 获取页面的编码值
+                $menu = require Yii::getAlias('@backendApi/config/menu.php');// 获取此页面code,对应的权限值
+                $pagePermission = $this->checkPagePermission($sqlCode, $menu);
+                if (empty($pagePermission)) {
+                    return self::notice('Insufficient user permissions', 403);
+                }
+                if(!Yii::$app->user->validateAdminAction($pagePermission['controller'], $pagePermission['action'])) {
+
+                    return self::notice('Insufficient user permissions', 403);
+                } else {
+                    
+                    return $parentBeforeAction;
+                }
+            }
+            
             return self::notice('Insufficient user permissions', 403);
         }
         return $parentBeforeAction;
     }
 
+    public function checkPagePermission($sqlCode, $menu, &$ret=[]){
+        foreach($menu as $key => $parentMenu){
+            // 判断是否存在此值
+            if(isset($parentMenu['schemaApi']) && $parentMenu['schemaApi'] == $sqlCode){
+               
+                $ret = $parentMenu;
+                
+            }
+            // 判断子菜单是否存在
+            if(isset($parentMenu['child']) && !empty($parentMenu['child'])){
+                self::checkPagePermission($sqlCode, $parentMenu['child'], $ret);
+            }
+        }
+        
+        return $ret;
+    }
+
     /**
      * 返回结果集
      * @param $dataOrErrorMessage

+ 35 - 9
backendApi/modules/v1/controllers/OauthController.php

@@ -48,7 +48,7 @@ class OauthController extends BaseController
     // "leaf":true, 是否有子数据
     // "url":"home" 浏览器的url
 
-    private function _testMenu($parentArray){
+    private function _renderMenu($parentArray){
         $menuResult = [];
         foreach($parentArray as $key => $parentMenu){
             $temp = [];
@@ -60,24 +60,25 @@ class OauthController extends BaseController
             $temp['leaf'] =  $hasSon;// 是否有子节点
             if (!$hasSon) {
                 $temp['url'] =  "/".$parentMenu['routePath']; // 浏览器上展示的前端路由
-                $temp['schemaApi'] = isset($parentMenu['schemaApi']) ? $parentMenu['schemaApi'] : "/page/aa"; // 获取页面的请求.之前没有,之前是请求的后端api请求
+                $temp['schemaApi'] = isset($parentMenu['schemaApi']) ? '/v1/oauth/page?code='.$parentMenu['schemaApi'] : ""; // 获取页面的请求.之前没有,之前是请求的后端api请求
             }else {
                 if (strpos($parentMenu['routePath'], "/") !== false) {
                     // 如果包含/ , 表示需要展示到页面上
-                    $temp['schemaApi'] = isset($parentMenu['schemaApi']) ? $parentMenu['schemaApi'] : "/page/aa"; // 获取页面的请求.之前没有,之前是请求的后端api请求
+                    $temp['schemaApi'] = isset($parentMenu['schemaApi']) ? '/v1/oauth/page?code='.$parentMenu['schemaApi'] : ""; // 获取页面的请求.之前没有,之前是请求的后端api请求
                 }
             } 
             if(isset($parentMenu['child']) && !empty($parentMenu['child'])){
-                $temp['children'] = $this->_testMenu($parentMenu['child']);
+                $temp['children'] = $this->_renderMenu($parentMenu['child']);
             }
             $menuResult[] = $temp;
         }
         return $menuResult;
     }
 
-    public function actionTestmenu(){
+    public function actionSystemMenu(){
         $menu = require Yii::getAlias('@backendApi/config/menu.php');
-        $menu = $this->_testMenu($menu);
+        $menu = $this->_adminChildMenu($menu); // 先校验权限
+        $menu = $this->_renderMenu($menu);// 返回渲染的格式
         $children = [
             'children' => $menu
         ];
@@ -92,14 +93,39 @@ class OauthController extends BaseController
         return static::notice($ret);
     }
 
+    private function _adminChildMenu($parentArray){
+        $menuResult = [];
+        foreach($parentArray as $key => $parentMenu){
+            // 菜单是否显示
+            if(isset($parentMenu['show']) && !$parentMenu['show']){
+                continue;
+            }
+            // 查看是否有该控制器的权限
+            if(isset($parentMenu['controller']) && $parentMenu['controller']){
+                if(!Yii::$app->user->validateAdminController($parentMenu['controller'])) continue;
+            }
+            // 查看是否有权限
+            if(isset($parentMenu['action']) && $parentMenu['action']){
+                if(!Yii::$app->user->validateAdminAction($parentMenu['controller'], $parentMenu['action'])) continue;
+            }
+            // 子菜单同样设置
+            if(isset($parentMenu['child']) && !empty($parentMenu['child'])){
+                $parentMenu['child'] = $this->_childMenu($parentMenu['child']);
+            }
+            // 如果在白名单的不显示菜单
+            if(isset($parentMenu['controller']) && $parentMenu['controller']){
+                if(Yii::$app->user->noCheckAdminController($parentMenu['controller'])) continue;
+            }
+            $menuResult[] = $parentMenu;
+        }
+        return $menuResult;
+    }
+
     // 获取页面
     public function actionPage(){
         $request = Yii::$app->request;
         $sqlCode = $request->get('code', '');
         $pageInfo = PageDetails::getInfoByCode($sqlCode);
-        $a = [
-            $pageInfo['page_json']
-        ];
         Yii::$app->response->format = Response::FORMAT_HTML;
         
         return $pageInfo['page_json'];