申明:方法是本人摸索出来的,不是官方文档的方法(野路子)。
问题描述:
在使用若依自带的代码生成工具生成页面,即使是管理员不该拥有的页面也会渲染在页面上。比如比赛评审什么的,你既是“活动发布者”又是“参赛者”,这怎么玩?
解决思路:
方法一:后端解决方法
找到获取路由的方法:
在后端工程查找该方法
com.ruoyi.web.controller.system.SysLoginController#getRouters
我是在前端处理的,后端代码就不演示处理逻辑了
方法二:前端解决方案
找到permission文件的filterAsyncRouter方法,定义excludeTitles数组用于存储需要删除的路由的标题,在后方添加角色判断,如果是admin执行什么操作。
顺带一提,这个方法即使是管理员知道路径也无法访问被屏蔽掉的页面
实际解决办法:
导入工具函数
import { checkRole } from '../../utils/permission'
正式处理逻辑
const excludeTitles = ['活动申报','已申报的项目']; // 需要排除的路由标题数组
function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
return asyncRouterMap.filter(route => {
if (type && route.children) {
route.children = filterChildren(route.children)
}
if (route.component) {
// Layout ParentView 组件特殊处理
if (route.component === 'Layout') {
route.component = Layout
} else if (route.component === 'ParentView') {
route.component = ParentView
} else if (route.component === 'InnerLink') {
route.component = InnerLink
} else {
route.component = loadView(route.component)
}
}
if (route.children != null && route.children && route.children.length) {
route.children = filterAsyncRouter(route.children, route, type)
} else {
delete route['children']
delete route['redirect']
}
// 检查当前用户是否是管理员
if (checkRole(['admin'])) {
// 如果是管理员,删除在excludeTitles数组中的路由项
if (route.meta && excludeTitles.includes(route.meta.title)) {
return false
}
}
return true
})
}
个人看法:
管理员拥有所有方法的数据权限,要解决的话或许可以在需要的方法上添加:
@PreAuthorize("@ss.lacksRole('admin')")
排除管理员的操作。
个人看法!如有错误欢迎指正。
最后:如果有更好的解决方案的话...... 教教我~~~