1、路由权限
(此例仅以react+antd为例)
菜单权限
- 首先说明每个用户登录的时候由于权限不同,所以展示的左侧菜单(菜单的每一列就会代表一个路由)是不一样的 1、当用户打开项目的时候,会请求init接口,这个接口是用户的个人信息,其中包括一个权限的字段(permissionList),里面是当前用户所对应的权限列表路由名称
"init": {
"ret": 0,
"msg": "",
"content": {
"userName": "张二狗",
"permissionList": [ // 这里的每一项都都是和路由名称一样的
"channel_menu",
"channel_statistics_menu",
"channel_manage_menu"
]
}
}
2、前端渲染的菜单列表中每一个菜单都有一个key值和permissionList里的路由名称一样,所以当菜单列表渲染的时候会判断每一个菜单的key在permissionList里有没有,如果没有就不展示这个菜单。那这就是菜单列表的权限控制
每一个页面的操作权限(增删改等)
1、还是跟上面菜单权限类似,给init接口的permissionList字段增加每个页面的操作权限字段
"init": {
"ret": 0,
"msg": "",
"content": {
"userName": "张二狗",
"permissionList": [
"menu1",
"menu2",
"menu1_add",
"menu2_edit"
]
}
}
2、当页面的操作按钮(每一个按钮都会有一个写死的字段和permissionList里的名字样)渲染时,会先判断这个按钮上写死的字段在permissionList里有没有,如果没有,那就是没有权限,就把按钮置灰,不让用户点击(每一个页面的按钮都是这样的)
那么问题来了,假如菜单里没有某一个页面的权限,那用户通过新打开一个页面在url里直接拼路由打开页面怎么办
1、第一种方法 当用户通过自己拼url的方式打开了一个没有权限的页面,请求接口时,这时后台会检测这个接口是不是有权限页面的接口,如果发现不是,那么接口的ret就返回41002,那么我们就可以在封装的request请求方法里做判断,如果接口的ret是41002,那么前端就把页面重定向到没有权限页面
2、第二种方法 每当我们第一次打开页面或者切换路由的时候Router的update方法就会执行,我们在这里拿到当前页面的路由看看permissionList里有没有(permissionList里的每一项的命名规则就是页面路由名称),如果没有就给他重定向到没有权限页面