要解决的问题:ant design pro默认情况下,菜单和路由都用配置的方式,在前端的config/config.ts中配置。但是大多数后台系统都需要由后端服务器控制权限。

类似的需求一般包括两点:

1、“只看该看的,防君子”:不同角色对应不同菜单,在用户登录时,由服务器根据登录用户的角色生成菜单;有权限的菜单显示,没权限的菜单隐藏。

2、“想看也不行,防小人”:防止用户直接通过在浏览器中输入未授权菜单的path进行访问。

Ant design pro v4版本的官方上,简单说明了从服务器拉取菜单的方法,但是说得很简略,对新手来说还要自己摸索一番。而且这个方案,只能实现上面提到的第1条,只要path被用户知道了,仍然可以强行输入path进行访问。在网上查了半天,才找到解决第2条的方法——动态更新路由。下面就把我的经验分享给大家,不对之处还望指出,不吝赐教。

拉取服务器菜单

1. 实现menuModel,在srcmodels下,添加menu.ts

import { Effect } from 'dva';
import { Reducer } from 'redux';
import { getMenuData } from '@/services/menu';export interface MenuModelState {menuData?: any[];
}export interface MenuModelType {namespace: 'menu';state: MenuModelState;effects: {fetchMenu: Effect;};reducers: {saveMenuData: Reducer<MenuModelState>;};
}const MenuModel: MenuModelType = {namespace: 'menu',state: {menuData: [],},effects: {*fetchMenu(_, { call, put }) {const response = yield call(getMenuData);yield put({type: 'saveMenuData',payload: response.data,});},},reducers: {saveMenuData(state, action) {return {...state,menuData: action.payload || [],};},},
};export default MenuModel;

2. 实现menuService,在srcservices下,添加menu.ts

import request from '@/utils/request';export async function getMenuData(): Promise<any> {return request('/api/account/get_menu',{method: 'POST',});
}

3. 在BasicLayout.tsx中使用connect装饰器进行状态属性绑定

export default connect(({ global, settings, menu }: ConnectState) => ({collapsed: global.collapsed,settings,menuData: menu.menuData,
}))(BasicLayout);

4. 修改BasicLayout.tsx中ProLayout的menuDataRender

const {dispatch,children,settings,location = {pathname: '/',},menuData,
} = props;const serverMenuItem = ():MenuDataItem[]=>{const transMenuItem :MenuDataItem[] = [];if(Array.isArray(menuData)){menuData.forEach((v) => {const localV = { ...v, children: v.children ? menuDataRender(v.children) : [] };const localMenuDataItem = Authorized.check(v.authority, localV, null) as MenuDataItem;transMenuItem.push(localMenuDataItem);});}return transMenuItem;
};menuDataRender={serverMenuItem}

5. 服务器下发的菜单格式

{"code": 0,"message": "response successful","data": [{"path": "/overview","name": "数据总览","children": [{"path": "/overview/daily","name": "analysis12","children": null,"authority": null}],"authority": ["admin", "user"]}, {"path": "/function","name": "gongneng","children": [{"path": "/function/sign","name": "sign111","children": null,"authority": null}, {"path": "/function/task","name": "task111","children": null,"authority": ["admin"]}, {"path": "/function/pay","name": "task111","children": null,"authority": ["admin"]}],"authority": null}]
}

6. 菜单权限说明

登录后,根据用户的角色返回对应的菜单树,服务器下发的菜单才会显示。

动态更新路由

1. 添加umi运行时配置,在src下添加app.tsx

import pathRegexp from "path-to-regexp";
import { Route } from '@/models/connect';let extraRoutes:Route[];const updateRouteAuthority = (path: string, routeData: Route[], sAuth: string[] | string | undefined) => {if(routeData && Array.isArray(routeData)){routeData.forEach(route => {if(route.path){if((route.path === '/') || (pathRegexp(`${route.path}/(.*)`).test(`${path}/`))){if (route.path === path && sAuth) {route.authority = sAuth;}if (route.routes) {updateRouteAuthority(path, route.routes, sAuth);}}}});}
};const patchEachRoute = (serverRoute: Route[], routes:Route[])=>{if(serverRoute && Array.isArray(serverRoute)){serverRoute.forEach(eRoute => {updateRouteAuthority(`${eRoute.path}`, routes, eRoute.authority);if(eRoute.children){patchEachRoute(eRoute.children, routes)}});}
};export function patchRoutes(routes:Route[]) {if(extraRoutes){patchEachRoute(extraRoutes, routes);}
}export function render(oldRender) {fetch('/api/account/get_route',{method:'POST'}).then(res=>res.json()).then(res => {if(res.code === 0){extraRoutes = res.data;}oldRender();})
}

2. 服务器下发路由格式与菜单格式相同

登录前先拉取路由信息,在patchRoutes中根据服务器下发的路由权限,刷新本地srcpages.umirouter.js中route的authority信息。这样,即使用户强制输入path进行访问也会被拒。

7nfs客户端没权限_Ant design pro v4-服务器菜单和路由权限控制相关推荐

  1. UmiJS TypeScript Ant Design Pro v4 从零开始实战教程(63 个视频)

    UmiJS & TypeScript & Ant Design Pro v4 从零开始实战教程(63 个视频) Antd Pro 是国内最流行的前端后台框架,使用它可以轻易搭建一个超级 ...

  2. 23 版本以上的v4包_Ant Design Pro V2升级到V4 小结

    前言 前不久接手过一个历史悠久的项(shi)目(shan),技术栈之复杂(混乱)令我潸然泪下:你甚至可以在一个项目里使用前端三大框架(Angular1, Vue, React). 三份的代码,本应该给 ...

  3. Ant design pro v4-服务器菜单和路由权限控制

    要解决的问题:ant design pro默认情况下,菜单和路由都用配置的方式,在前端的config/config.ts中配置.但是大多数后台系统都需要由后端服务器控制权限. 类似的需求一般包括两点: ...

  4. ant design pro v4 从后台服务器请求菜单,思路,具体代码及坑

    原文见:https://www.yuque.com/asuncat/htn2dd/wgnx0u 版本信息 ant design pro : v4.2.2 umi: v3.2.14 pro-layout ...

  5. Ant Design Pro v4 is Here

    Ant Design Pro v4 is Here 距离 Pro 的上个版本发布已经过去了 8 个月,Pro 也进行了许多的迭代,但是大部分更新仍然以修复 bug 为主.在此期间我们遇到了许多使用 P ...

  6. antd权限管理_Ant Design Pro开发后台管理系统(权限)-阿里云开发者社区

    前言 权限是后台管理系统常见的需求,后台开发必须考虑设计的模块,antd-pro给我们提供了很好的关于权限的封装,我们只需要在配置菜单的时候配置上准入身份,在登录成功以后获取到登陆者身份以后更新登录人 ...

  7. ant design pro模板_Ant Design Pro入门教程,安装,运行(V5 Typescript版)

    [前言] 找了很多Admin模板,最后还是看中了AntDesignPro这个阿里巴巴开源的Admin框架,长这样(还行吧,目前挺主流的): 该套模板是使用了React开发框架作为基础,AntDesig ...

  8. ant design pro (十六)advanced 权限管理

    一.概述 原文地址:https://pro.ant.design/docs/authority-management-cn 权限控制是中后台系统中常见的需求之一,你可以利用我们提供的权限控制组件,实现 ...

  9. ant design pro模板_ant design pro 当中改变ant design 组件的样式和 数据管理

    ant design pro 简介 官网简介 Ant Design Pro 是一个企业级中后台前端/设计解决方案,我们秉承 Ant Design 的设计价值观,致力于在设计规范和基础组件的基础上,继续 ...

最新文章

  1. 用 Docker 构建、运行、发布来一个 Spring Boot 应用
  2. linux驱动篇之 driver_register 过程分析(一)
  3. bugku ——加密 做题记录
  4. cocos2d-x游戏开发(十二)场景切换:滑门效果
  5. 怎么用python做战斗机_关于python文件操作
  6. 华为云鲲鹏云服务器RC6正式公测,多元算力加速企业创新升级
  7. java 解决内存泄露_Java内存泄露的理解与解决
  8. IOError: encoder jpeg not available
  9. 计算机算法专业英语,计算机算法相关术语的英语词汇
  10. Python爬虫与数据可视化案例(共享源码)
  11. html设置网页的大小怎么设置方法,网页字体大小怎么样去设置
  12. 不合适学计算机的人,想学计算机,这三类人并不合适!
  13. 【校内互侧】ZYF loves binary (dp)
  14. Assembler messages error gcc and clang build
  15. 大风车吱呀吱悠悠地转
  16. 就这样吧,从此山水不相逢
  17. 【刷题日记】网易——瞌睡
  18. netstat成昨日黄花,SS和IP命令接力?
  19. 【计算机科学基础】Markdown核心语法
  20. 208核、6TB内存,阿里云发布全球最强云服务器:挑战摩尔定律极限

热门文章

  1. web系统 手机app 能访问吗?_苹果手机能下载什么好用的桌面便签?有什么好的便签app推荐吗...
  2. linux共享xp打印机驱动下载,给debian共享winxp下的打印机
  3. pytorch载入预训练模型后,训练指定层
  4. Win7系统Visual Studio 2013配置OpenCV3.1图文详解
  5. EF支持复杂类型的实现
  6. laravel 重要概念 以及实现方式
  7. 常用正则表达式总结(js与C#对照)
  8. sql 自动增加排序 并且初始值是000001
  9. DotnetSpider (一) 架构的理解、应用、搭建
  10. 序列化类型为XX的对象时检测到循环引用