pig 如何控制菜单权限控制
在后台菜单管理中给指定菜单添加 按钮节点 需要指定 权限标志
- 例如: sys_file_add、sys_file_del、sys_file_edit
前端CRUD 会自定生成关联按钮,只需要在 computed 生命周期注入对应的权限标识。 - 若扩展菜单 (非增删改查),则使用vuex保存用户的权限信息,然后通过v-if 判断是否有权限,如果有权限就渲染这个dom元素。
例如:ext_btn
前端控制
我们以 用户管理页面来讲解
//按钮v-if使用
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button v-if="ext_btn" size="small" type="success" @click="handleUpdate(scope.row)">扩展
</el-button>
</template>
</el-table-column>
// 变量初始化
created() {
this.getList();
this.ext_btn = this.permissions["ext_btn"];
},
// 从vuex 获取保存的permissions,自定控制生成的增删改权限
computed: {
...mapGetters(["permissions"])
permissionList() {
return {
addBtn: this.vaildData(this.permissions.sys_file_add, false),
delBtn: this.vaildData(this.permissions.sys_file_del, true),
editBtn: this.vaildData(this.permissions.sys_file_edit, false)
}
}
//permissions获取
getUserInfo(state.token).then(response => {
commit('SET_PERMISSIONS', data.permissions)
})
后端权限控制
只需要在接口增加
@PreAuthorize("@pms.hasPermission('XXX')")
原理
通过获取用户菜单列表,和请求的地址和请求方法对比判断有没有权限
public boolean hasPermission(HttpServletRequest request, Authentication authentication) {
Object principal = authentication.getPrincipal();
List<SimpleGrantedAuthority> grantedAuthorityList = (List<SimpleGrantedAuthority>) authentication.getAuthorities();
boolean hasPermission = false;
if (principal != null) {
if (CollectionUtil.isEmpty(grantedAuthorityList)) {
return hasPermission;
}
Set<MenuVo> urls = new HashSet<>();
for (SimpleGrantedAuthority authority : grantedAuthorityList) {
urls.addAll(menuService.findMenuByRole(authority.getAuthority()));
}
for (MenuVo menu : urls) {
if (StringUtils.isNotEmpty(menu.getUrl()) && antPathMatcher.match(menu.getUrl(), request.getRequestURI())
&& request.getMethod().equalsIgnoreCase(menu.getMethod())) {
hasPermission = true;
break;
}
}
}
return hasPermission;
}