Ant Design Pro 防止从浏览器输入框进入未授权路由
Ant Design Pro 防止从浏览器输入框进入未授权路由
版本
- antd ^4.8.6
- umi ^3.2.14
动态渲染菜单
首先要把 BasicLayout
组件里的菜单渲染逻辑修改成动态渲染,同时还要把 icon 显示出来。
// path src/layouts/BasicLayout.js
const iconsEnum = {
table: <TableOutlined />
}
// in BasicLayout function
const mappingIcon = menuData => {
const _authority = getAuthority()
const mappingMenu = menuData.map(item => ({
...item,
icon: iconsEnum[item.icon],
authority: _authority,
children: item.children ? mappingIcon(item.children) : [],
}));
return mappingMenu;
};
const _menuData = mappingIcon(menuData) // 将 icon jsx 绑定到 menuData
// in ProLayout
menuDataRender={() => _menuData
防止从浏览器进入未授权路由
比如我在地址栏输入 /admin
能进入 admin 路由,而该路由并不存在于 menuData
,显然不合理。所以需要校验 window.location.pathname
是否存在于 menuData
。因为 menuData
可能还有子路由嵌套,所以应该使用递归函数来处理这个问题。
// path src/layouts/BasicLayout.js
const checkMenuAccess = (menuItem) => {
if(menuItem.children) {
menuItem.children.forEach((item) => {
return checkMenuAccess(item)
})
} else {
return menuItem.path === window.location.pathname
}
}
if(!loading && loading !== undefined) {
const pathAccess = menuData.find((item) => {
if(window.location.pathname === '/404') {
return true
}
return checkMenuAccess(item)
})
if(!pathAccess && pathAccess !== undefined) {
history.push('/404')
}
}
使用 dva loading 来避免重复渲染。
本文参考
- 封图摄于 cp27
作者:hayato
文章版权:本站所有文章版权依赖于 CC BY-NC-SA 3.0 Unported License
本文链接:https://blog.axis-studio.org/2021/01/10/ant-design-pro-防止从浏览器输入框进入未授权路由/