Explorar el Código

鉴权移动到代理服务

lrf hace 11 meses
padre
commit
d5c4b55f57

+ 6 - 2
README.md

@@ -3,8 +3,11 @@
 ## 1.单点登录
 * 1.不需要登录就可以使用的接口: 请求函数的方法注解参数添加 description: 'ignore'即可
 
+## controller 中 controllerCode 为 前端菜单管理中 route_name(路由名称的编码) 
+
+
 ## 2.注解
-* checkPermissionCode
+* checkPermissionCode(不需要了)
 |注解名|类型|说明|
 |:-:|:-:|:-:|
 |roleCode|string|该接口权限所需标识 ${路由名称}.${功能}. 如果是query, 只写${路由名称},其他查询方法自己规定|
@@ -18,13 +21,14 @@
     vue中的method(函数名) 要与 菜单中功能列表 的函数名对上----保证按钮正常判断
     method中调用的api的roleCode 需要与功能列表中的 code 能对应上: 
       e.g.: 更换 状态 只是点击 启用/禁用 不过用的是 修改接口 所以该接口是需要有 修改接口的权限 与 页面上可以使用该接口的按钮
-
+  如果在功能列表中添加: 访问的api路径呢,到controller为止,就可以判断是否能使用
 对于权限这里有的想法:
   按当前确定好的数据来看, 可以直接得出:
     1.某功能全路径的编码
   而当前用户需要检验用户编码时,一定能得到该用户所有权限编码(可以是全路径)
   然后在用 权限编码 核对
   那么现在主要就是 不知道 当前是哪个权限编码,如果可以确定这个权限编码,就可以在代理项目中处理权限问题
+  也就是功能列表需要填写 
 * dataRecord (应该不用了)
 |注解名|类型|说明|
 |:-:|:-:|:-:|

+ 0 - 5
src/configuration.ts

@@ -6,8 +6,6 @@ import { join } from 'path';
 import * as FreeFrame from 'free-midway-component';
 import * as jwt from '@midwayjs/jwt';
 import * as ws from '@midwayjs/ws';
-import { VerifyTokenInit } from './decorator/verifyToken.decorator';
-import { CheckPermissionCodeInit } from './decorator/checkPermissionCode';
 import * as swagger from '@midwayjs/swagger';
 import * as redis from '@midwayjs/redis';
 import { newsQueryMiddleware } from './middleware/newsQuery.middleware';
@@ -50,9 +48,6 @@ export class MainConfiguration {
     this.app.getMiddleware().insertAfter(DataRecordMiddleware, 'SetLocaleToCtxMiddleware');
     this.app.getMiddleware().insertAfter(newsQueryMiddleware, 'newsQuery');
     this.app.getMiddleware().insertFirst(ReportMiddleware)
-    // 注解
-    VerifyTokenInit(this.decoratorService);
-    CheckPermissionCodeInit(this.decoratorService);
   }
   // 应用服务已启动后执行
   async onServerReady?(container: IMidwayContainer, app: IMidwayApplication) {

+ 3 - 1
src/controller/home.controller.ts

@@ -7,8 +7,10 @@ export class HomeController {
   ctx: Context;
   @Inject()
   i18n: MidwayI18nService;
+
+
   @Get('/', { description: 'ignore' })
   async home(): Promise<string> {
-    return 'server starting' ;
+    return 'server starting';
   }
 }

+ 1 - 2
src/controller/system/admin.controller.ts

@@ -4,16 +4,15 @@ import { AdminService } from '../../service/system/admin.service';
 import { CDTO_admin, CVO_admin, FVO_admin, QDTO_admin, QVO_admin, UDTO_admin, UVAO_admin } from '../../interface/system/admin.interface';
 import { ApiResponse, ApiTags, ApiQuery } from '@midwayjs/swagger';
 import { Validate } from '@midwayjs/validate';
-import { checkPermissionCode } from '../../decorator/checkPermissionCode';
 @ApiTags(['管理用户表'])
 @Controller('/admin')
 export class AdminController extends BaseController {
+  controllerCode = 'user_admin';
   @Inject()
   service: AdminService;
 
   @Post('/')
   @Validate()
-  @checkPermissionCode({ roleCode: 'system_admin.add' })
   @ApiResponse({ type: CVO_admin })
   async create(@Body() data: CDTO_admin) {
     const dbData = await this.service.create(data);

+ 1 - 0
src/controller/system/config.controller.ts

@@ -9,6 +9,7 @@ import { I18nService } from '../../service/i18n.service';
 @ApiTags(['设置表'])
 @Controller('/config')
 export class ConfigController extends BaseController {
+  controllerCode = 'system_design';
   @Inject()
   service: ConfigService;
   @Inject()

+ 1 - 7
src/controller/system/dept.controller.ts

@@ -4,16 +4,15 @@ import { DeptService } from '../../service/system/dept.service';
 import { CDTO_dept, CVO_dept, FVO_dept, QDTO_dept, QVO_dept, UDTO_dept, UVAO_dept } from '../../interface/system/dept.interface';
 import { ApiResponse, ApiTags, ApiQuery } from '@midwayjs/swagger';
 import { Validate } from '@midwayjs/validate';
-import { checkPermissionCode } from '../../decorator/checkPermissionCode';
 @ApiTags(['部门表'])
 @Controller('/dept')
 export class DeptController extends BaseController {
+  controllerCode = 'system_dept';
   @Inject()
   service: DeptService;
 
   @Post('/')
   @Validate()
-  @checkPermissionCode({ roleCode: 'system_dept.create' })
   @ApiResponse({ type: CVO_dept })
   async create(@Body() data: CDTO_dept) {
     const dbData = await this.service.create(data);
@@ -22,7 +21,6 @@ export class DeptController extends BaseController {
   }
   @Get('/')
   @ApiQuery({ name: 'query' })
-  @checkPermissionCode({ roleCode: 'system_dept' })
   @ApiResponse({ type: QVO_dept })
   async query() {
     const data = await this.service.queryAll();
@@ -30,7 +28,6 @@ export class DeptController extends BaseController {
   }
   @Get('/nextLevel/:id')
   @ApiQuery({ name: 'nextLevel' })
-  @checkPermissionCode({ roleCode: 'system_dept.nextLevel' })
   @ApiResponse({ type: QVO_dept })
   async nextLevel(@Param('id') id: string, @Query('skip') skip: number, @Query('limit') limit: number) {
     const { data, total } = await this.service.getNextLevel(id, { skip, limit });
@@ -38,7 +35,6 @@ export class DeptController extends BaseController {
   }
 
   @Get('/:id')
-  @checkPermissionCode({ roleCode: 'system_dept' })
   @ApiResponse({ type: FVO_dept })
   async fetch(@Param('id') id: string) {
     const data = await this.service.fetch(id);
@@ -48,7 +44,6 @@ export class DeptController extends BaseController {
 
   @Post('/:id')
   @Validate()
-  @checkPermissionCode({ roleCode: 'system_dept.update' })
   @ApiResponse({ type: UVAO_dept })
   async update(@Param('id') id: string, @Body() body: UDTO_dept) {
     const result = await this.service.updateOne(id, body);
@@ -56,7 +51,6 @@ export class DeptController extends BaseController {
   }
 
   @Del('/:id')
-  @checkPermissionCode({ roleCode: 'system_dept.delete' })
   @Validate()
   async delete(@Param('id') id: string) {
     await this.service.delete(id);

+ 1 - 6
src/controller/system/dictData.controller.ts

@@ -4,16 +4,15 @@ import { DictDataService } from '../../service/system/dictData.service';
 import { CDTO_dictData, CVO_dictData, FVO_dictData, QDTO_dictData, QVO_dictData, UDTO_dictData, UVAO_dictData } from '../../interface/system/dictData.interface';
 import { ApiResponse, ApiTags, ApiQuery } from '@midwayjs/swagger';
 import { Validate } from '@midwayjs/validate';
-import { checkPermissionCode } from '../../decorator/checkPermissionCode';
 @ApiTags(['字典数据表'])
 @Controller('/dictData')
 export class DictDataController extends BaseController {
+  controllerCode = 'system_dict';
   @Inject()
   service: DictDataService;
 
   @Post('/')
   @Validate()
-  @checkPermissionCode({ roleCode: 'system_dict.create' })
   @ApiResponse({ type: CVO_dictData })
   async create(@Body() data: CDTO_dictData) {
     const dbData = await this.service.create(data);
@@ -22,7 +21,6 @@ export class DictDataController extends BaseController {
   }
   @Get('/')
   @ApiQuery({ name: 'query' })
-  @checkPermissionCode({ roleCode: 'system_dict' })
   @ApiResponse({ type: QVO_dictData })
   async query(@Query() filter: QDTO_dictData, @Query('skip') skip: number, @Query('limit') limit: number) {
     const list = await this.service.query(filter, { skip, limit, sort: { sort: 1 } });
@@ -36,7 +34,6 @@ export class DictDataController extends BaseController {
   }
 
   @Get('/:id')
-  @checkPermissionCode({ roleCode: 'system_dict' })
   @ApiResponse({ type: FVO_dictData })
   async fetch(@Param('id') id: string) {
     const data = await this.service.fetch(id);
@@ -46,7 +43,6 @@ export class DictDataController extends BaseController {
 
   @Post('/:id')
   @Validate()
-  @checkPermissionCode({ roleCode: 'system_dict.update' })
   @ApiResponse({ type: UVAO_dictData })
   async update(@Param('id') id: string, @Body() body: UDTO_dictData) {
     const result = await this.service.updateOne(id, body);
@@ -54,7 +50,6 @@ export class DictDataController extends BaseController {
   }
 
   @Del('/:id')
-  @checkPermissionCode({ roleCode: 'system_dict.delete' })
   @Validate()
   async delete(@Param('id') id: string) {
     await this.service.delete(id);

+ 2 - 6
src/controller/system/dictType.controller.ts

@@ -4,16 +4,16 @@ import { DictTypeService } from '../../service/system/dictType.service';
 import { CDTO_dictType, CVO_dictType, FVO_dictType, QDTO_dictType, QVO_dictType, UDTO_dictType, UVAO_dictType } from '../../interface/system/dictType.interface';
 import { ApiResponse, ApiTags, ApiQuery } from '@midwayjs/swagger';
 import { Validate } from '@midwayjs/validate';
-import { checkPermissionCode } from '../../decorator/checkPermissionCode';
 @ApiTags(['字典类型表'])
 @Controller('/dictType')
 export class DictTypeController extends BaseController {
+  controllerCode = 'system_dict';
+
   @Inject()
   service: DictTypeService;
 
   @Post('/')
   @Validate()
-  @checkPermissionCode({ roleCode: 'system_dict.create' })
   @ApiResponse({ type: CVO_dictType })
   async create(@Body() data: CDTO_dictType) {
     const dbData = await this.service.create(data);
@@ -22,7 +22,6 @@ export class DictTypeController extends BaseController {
   }
   @Get('/')
   @ApiQuery({ name: 'query' })
-  @checkPermissionCode({ roleCode: 'system_dict' })
   @ApiResponse({ type: QVO_dictType })
   async query(@Query() filter: QDTO_dictType, @Query('skip') skip: number, @Query('limit') limit: number) {
     const list = await this.service.query(filter, { skip, limit });
@@ -36,7 +35,6 @@ export class DictTypeController extends BaseController {
   }
 
   @Get('/:id')
-  @checkPermissionCode({ roleCode: 'system_dict' })
   @ApiResponse({ type: FVO_dictType })
   async fetch(@Param('id') id: string) {
     const data = await this.service.fetch(id);
@@ -46,7 +44,6 @@ export class DictTypeController extends BaseController {
 
   @Post('/:id')
   @Validate()
-  @checkPermissionCode({ roleCode: 'system_dict.update' })
   @ApiResponse({ type: UVAO_dictType })
   async update(@Param('id') id: string, @Body() body: UDTO_dictType) {
     const result = await this.service.updateOne(id, body);
@@ -54,7 +51,6 @@ export class DictTypeController extends BaseController {
   }
 
   @Del('/:id')
-  @checkPermissionCode({ roleCode: 'system_dict.delete' })
   @Validate()
   async delete(@Param('id') id: string) {
     await this.service.delete(id);

+ 1 - 6
src/controller/system/menus.controller.ts

@@ -4,16 +4,15 @@ import { MenusService } from '../../service/system/menus.service';
 import { CDTO_menus, CVO_menus, FVO_menus, QVO_menus, UDTO_menus, UVAO_menus } from '../../interface/system/menus.interface';
 import { ApiResponse, ApiTags, ApiQuery } from '@midwayjs/swagger';
 import { Validate } from '@midwayjs/validate';
-import { checkPermissionCode } from '../../decorator/checkPermissionCode';
 @ApiTags(['菜单表'])
 @Controller('/menus')
 export class MenusController extends BaseController {
+  controllerCode = 'system_menus';
   @Inject()
   service: MenusService;
 
   @Post('/')
   @Validate()
-  @checkPermissionCode({ roleCode: 'system_menus.create' })
   @ApiResponse({ type: CVO_menus })
   async create(@Body() data: CDTO_menus) {
     const dbData = await this.service.create(data);
@@ -22,7 +21,6 @@ export class MenusController extends BaseController {
   }
   @Get('/')
   @ApiQuery({ name: 'query' })
-  @checkPermissionCode({ roleCode: 'system_menus' })
   @ApiResponse({ type: QVO_menus })
   async query() {
     const list = await this.service.queryMenu();
@@ -30,7 +28,6 @@ export class MenusController extends BaseController {
   }
 
   @Get('/:id')
-  @checkPermissionCode({ roleCode: 'system_menus' })
   @ApiResponse({ type: FVO_menus })
   async fetch(@Param('id') id: string) {
     const data = await this.service.fetch(id);
@@ -40,7 +37,6 @@ export class MenusController extends BaseController {
 
   @Post('/:id')
   @Validate()
-  @checkPermissionCode({ roleCode: 'system_menus.update' })
   @ApiResponse({ type: UVAO_menus })
   async update(@Param('id') id: string, @Body() body: UDTO_menus) {
     const result = await this.service.updateOne(id, body);
@@ -48,7 +44,6 @@ export class MenusController extends BaseController {
   }
 
   @Del('/:id')
-  @checkPermissionCode({ roleCode: 'system_menus.delete' })
   @Validate()
   async delete(@Param('id') id: string) {
     await this.service.delete(id);

+ 1 - 12
src/controller/system/role.controller.ts

@@ -5,20 +5,17 @@ import { CDTO_role, CVO_role, FVO_role, QDTO_role, QVO_role, UDTO_role, UVAO_rol
 import { ApiResponse, ApiTags, ApiQuery } from '@midwayjs/swagger';
 import { Validate } from '@midwayjs/validate';
 import { MenusService } from '../../service/system/menus.service';
-import { verifyToken } from '../../decorator/verifyToken.decorator';
-import { checkPermissionCode } from '../../decorator/checkPermissionCode';
 @ApiTags(['角色表'])
 @Controller('/role')
 export class RoleController extends BaseController {
+  controllerCode = 'system_role';
   @Inject()
   service: RoleService;
   @Inject()
   menusService: MenusService;
 
   @Post('/')
-  @verifyToken()
   @Validate()
-  @checkPermissionCode({ roleCode: 'system_role.create' })
   @ApiResponse({ type: CVO_role })
   async create(@Body() data: CDTO_role) {
     const dbData = await this.service.create(data);
@@ -26,8 +23,6 @@ export class RoleController extends BaseController {
     return result;
   }
   @Get('/')
-  @verifyToken()
-  @checkPermissionCode({ roleCode: 'system_role' })
   @ApiQuery({ name: 'query' })
   @ApiResponse({ type: QVO_role })
   async query(@Query() filter: QDTO_role, @Query('skip') skip: number, @Query('limit') limit: number) {
@@ -42,8 +37,6 @@ export class RoleController extends BaseController {
   }
 
   @Get('/:id')
-  @verifyToken()
-  @checkPermissionCode({ roleCode: 'system_role' })
   @ApiResponse({ type: FVO_role })
   async fetch(@Param('id') id: string) {
     const data = await this.service.fetch(id);
@@ -52,8 +45,6 @@ export class RoleController extends BaseController {
   }
 
   @Post('/:id')
-  @verifyToken()
-  @checkPermissionCode({ roleCode: 'system_role.update' })
   @Validate()
   @ApiResponse({ type: UVAO_role })
   async update(@Param('id') id: string, @Body() body: UDTO_role) {
@@ -62,8 +53,6 @@ export class RoleController extends BaseController {
   }
 
   @Del('/:id')
-  @verifyToken()
-  @checkPermissionCode({ roleCode: 'system_role.delete' })
   @Validate()
   async delete(@Param('id') id: string) {
     await this.service.delete(id);

+ 1 - 0
src/controller/system/user.controller.ts

@@ -7,6 +7,7 @@ import { Validate } from '@midwayjs/validate';
 @ApiTags(['平台用户'])
 @Controller('/user')
 export class UserController extends BaseController {
+  controllerCode = 'user_user';
   @Inject()
   service: UserService;
 

+ 29 - 4
src/controller/token.controller.ts

@@ -6,17 +6,17 @@ const assert = require('assert');
 import { JwtService } from '@midwayjs/jwt';
 import get = require('lodash/get');
 import { RoleService } from '../service/system/role.service';
+import { MidwayWebRouterService, Post } from '@midwayjs/core';
 @ApiTags(['工具'])
 @Controller('/token')
 export class TokenController {
-  // @Inject()
-  // service: TokenService;
-
   @Inject()
   jwtService: JwtService;
 
   @Inject()
   roleService: RoleService;
+  @Inject()
+  webRouterService: MidwayWebRouterService;
 
   @Inject()
   ctx: Context;
@@ -28,13 +28,38 @@ export class TokenController {
     assert(token, '缺少token信息');
     const result: any = await this.jwtService.decode(token);
     const userMenusResult = await this.roleService.getUserMenus();
-    const menus = get(userMenusResult,'menus')
+    const menus = get(userMenusResult, 'menus');
     const role_code = get(userMenusResult, 'role_code');
     result.menus = menus;
     result.role_code = role_code;
     return result;
   }
 
+  /**
+   * 获取用户编码
+   * @returns 用户编码列表
+   */
+  @Post('/getUserApiCodes')
+  async getUserApiCodes() {
+    const codes = await this.roleService.getUserApiCodes();
+    return codes;
+  }
+  /**
+   * 查询要访问的路由编码,query没有 .query
+   * @returns {string} 路由编码
+   */
+  @Post('/gerRouterInfo')
+  async getRouterInfo() {
+    const body: any = this.ctx.request.body;
+    const route = await this.webRouterService.getMatchedRouterInfo(get(body, 'uri'), get(body, 'method'));
+    const col = new route.controllerClz();
+    const codes = [];
+    const controllerCode = col.controllerCode;
+    codes.push(controllerCode);
+    if (route.method !== 'query') codes.push(route.method);
+    const code = codes.join('.');
+    return code;
+  }
   // @Get('/app')
   // async appLogin(fiiter) {
   //   const { config, js_code } = fiiter.query;

+ 0 - 42
src/decorator/checkPermissionCode.ts

@@ -1,42 +0,0 @@
-import { JoinPoint, MidwayDecoratorService, REQUEST_OBJ_CTX_KEY, createCustomMethodDecorator } from '@midwayjs/core';
-import { FrameworkErrorEnum, ServiceError } from 'free-midway-component';
-import { get } from 'lodash';
-import { RoleService } from '../service/system/role.service';
-import { I18nService } from '../service/i18n.service';
-import { FrameErrorEnum } from '../error/frame.error';
-export const CHECKPERMISSIONCODE_KEY = 'decorator:check_permission_code';
-export const checkPermissionCode = options => {
-  return createCustomMethodDecorator(CHECKPERMISSIONCODE_KEY, options);
-};
-export const CheckPermissionCodeInit = (decoratorService: MidwayDecoratorService) => {
-  decoratorService.registerMethodHandler(CHECKPERMISSIONCODE_KEY, options => {
-    return {
-      around: async (joinPoint: JoinPoint) => {
-        const roleCode = get(options, 'metadata.roleCode');
-        if (roleCode) {
-          const instance = joinPoint.target;
-          const ctx = instance[REQUEST_OBJ_CTX_KEY];
-          const roleService = await ctx.requestContext.getAsync(RoleService);
-          const isAdmin = await roleService.isSuperAdmin();
-          if (!isAdmin) {
-            const roleMenus = await roleService.getUserMenus(true);
-            let result = false;
-            for (const rc of roleMenus) {
-              const r = rc.includes(roleCode);
-              if (r) {
-                result = r;
-                break;
-              }
-            }
-            if (!result) {
-              const i18n = await ctx.requestContext.getAsync(I18nService);
-              throw new ServiceError(i18n.translateError(FrameErrorEnum.NO_PERMISSION), FrameErrorEnum.NO_PERMISSION);
-            }
-          }
-        }
-        const result = await joinPoint.proceed(...joinPoint.args);
-        return result;
-      },
-    };
-  });
-};

+ 0 - 37
src/decorator/verifyToken.decorator.ts

@@ -1,37 +0,0 @@
-import {
-  JoinPoint,
-  MidwayDecoratorService,
-  REQUEST_OBJ_CTX_KEY,
-  createCustomMethodDecorator,
-} from '@midwayjs/core';
-import { FrameworkErrorEnum, ServiceError } from 'free-midway-component';
-export const VERIFYTOKEN_KEY = 'decorator:verify_token';
-/**
- *
- * 只检测是否有token,此装饰器不做具体用token处理什么.
- */
-export function verifyToken() {
-  return createCustomMethodDecorator(VERIFYTOKEN_KEY, {});
-}
-/**
- * 验证token装饰器实现
- * @param decoratorService 装饰器服务
- */
-export function VerifyTokenInit(decoratorService: MidwayDecoratorService) {
-  decoratorService.registerMethodHandler(VERIFYTOKEN_KEY, options => {
-    return {
-      around: async (joinPoint: JoinPoint) => {
-        const instance = joinPoint.target;
-        const ctx = instance[REQUEST_OBJ_CTX_KEY];
-        const user = ctx.user;
-        if (!user)
-          throw new ServiceError(
-            '未检测到登录信息,无法访问接口!',
-            FrameworkErrorEnum.NOT_LOGIN
-          );
-        const result = await joinPoint.proceed(...joinPoint.args);
-        return result;
-      },
-    };
-  });
-}

+ 6 - 0
src/entity/system/menus.entity.ts

@@ -1,5 +1,11 @@
 import { modelOptions, prop } from '@typegoose/typegoose';
 import { BaseModel } from 'free-midway-component';
+
+interface config {
+  zh: '中文';
+  code: '页面功能编码';
+  controller_code: '接口函数名路径';
+}
 @modelOptions({
   schemaOptions: { collection: 'menus' },
 })

+ 41 - 5
src/service/system/role.service.ts

@@ -1,14 +1,13 @@
 import { Provide, Inject } from '@midwayjs/decorator';
 import { InjectEntityModel } from '@midwayjs/typegoose';
 import { ReturnModelType } from '@typegoose/typegoose';
-import { BaseService, ServiceError, FrameworkErrorEnum } from 'free-midway-component';
+import { BaseService } from 'free-midway-component';
 import { Role } from '../../entity/system/role.entity';
 import { Menus } from '../../entity/system/menus.entity';
 import { MenusService } from './menus.service';
-import { flattenDeep, uniq, get, lowerFirst, upperFirst, last } from 'lodash';
+import { flattenDeep, uniq, get, lowerFirst, upperFirst, last, compact } from 'lodash';
 import { Context } from '@midwayjs/koa';
 import { I18nService } from '../i18n.service';
-import { FrameErrorEnum } from '../../error/frame.error';
 import { Admin } from '../../entity/system/admin.entity';
 import { Dept } from '../../entity/system/dept.entity';
 type modelType = ReturnModelType<typeof Role>;
@@ -39,6 +38,43 @@ export class RoleService extends BaseService<modelType> {
     if (!admin) return false;
     if (admin.is_super === '0') return true;
   }
+  /**
+   * 获取用户接口权限编码列表
+   * @returns {Array<string>} apiCodes 用户接口权限编码列表
+   */
+  async getUserApiCodes() {
+    const user = this.ctx.user;
+    const getControllerCode = list => {
+      const result = [];
+      for (const i of list) {
+        const { config = [], children = [] } = i;
+        const l = config.map(i => get(i, 'controller_code'));
+        result.push(...l);
+        if (children && children.length > 0) {
+          const cl = getControllerCode(children);
+          result.push(...cl);
+        }
+      }
+      return result;
+    };
+    if (await this.isSuperAdmin()) {
+      const menus = await this.menusService.queryMenu({ is_use: '0' });
+      // 需要整理出所有 config 中 methodCode = ${controllerCode}.${method} ,query 没有二级code
+      let apiCodes = getControllerCode(menus);
+      apiCodes = compact(apiCodes);
+      return apiCodes;
+    }
+    // 其他用户需要把 部门 和 角色的权限叠加在一起
+    // 部门权限
+    const deptCodes = await this.getDeptCodes(get(user, 'dept'));
+    // 角色权限
+    const roleCodes = await this.getRoleCodes(get(user, 'role'));
+    let allCodes = [...deptCodes, ...roleCodes];
+    allCodes = uniq(allCodes);
+    const menuList = await this.menusModel.find({ route_name: allCodes }).lean();
+    const apiCodes = getControllerCode(menuList);
+    return apiCodes;
+  }
 
   async getUserMenus(needCode = false) {
     const user = this.ctx.user;
@@ -74,9 +110,9 @@ export class RoleService extends BaseService<modelType> {
     const result = [];
     for (const code of allCodes) {
       const arr = code.split('.');
-      result.push(last(arr))
+      result.push(last(arr));
     }
-    return uniq(result)
+    return uniq(result);
   }
 
   /**