【深度解析RBAC用户-角色-权限设计方案,以及核心逻辑代码的讲解】
生活随笔
收集整理的這篇文章主要介紹了
【深度解析RBAC用户-角色-权限设计方案,以及核心逻辑代码的讲解】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先對于b2b、b2c等這一些網站后臺,一般情況下都需要權限管理的設計與實現,對于這部分,通常是固定不變的,每次只需要做少量的改動即可。
如何設計這幾張表呢?
RBAC(基于角色的訪問控制),也就是用戶通過角色與權限進行關聯;一個角色擁有多個角色,一個角色擁有多個權限;這樣就構成了下圖中的用戶-角色-權限的授權模型;
用戶與角色之間、角色與權限之間一般是多對多的關系。對于一對多關系表的設計中,我們一般是多的那一方多加入一個字段即可;而對于多對多關系表的設計,一般來說我們要借助第三方表
這五張表是至少的,也就是說權限的設計要>=5張表,具體需要多少張表還需要根據系統業務做相應的增加。
從上圖中我們可以觀察出,權限表與角色表通過role_permission表聯系起來,在role_permission表中必要的兩個字段就是權限id和角色id;當然用戶表和角色表也一樣。
有關核心的邏輯代碼
由于一個后臺系統可能包含多級菜單(權限),比如電器商品是一級菜單,電器商品刪除是二級菜單等等,所以在對所有的菜單(權限)進行查詢的過程中,需要進行樹狀顯示。所以需要進行遞歸遍歷。
@Overridepublic List<Permission> queryAllMenu() {//1 查詢菜單表所有數據QueryWrapper<Permission> wrapper = new QueryWrapper<>();wrapper.orderByDesc("id");List<Permission> permissionList = baseMapper.selectList(wrapper);//2 把查詢所有菜單list集合按照要求進行封裝List<Permission> resultList = bulidPermission(permissionList);return resultList;}//把返回所有菜單list集合進行封裝的方法public static List<Permission> bulidPermission(List<Permission> permissionList) {//創建list集合,用于數據最終封裝List<Permission> finalNode = new ArrayList<>();//把所有菜單list集合遍歷,得到頂層菜單 pid=0菜單,設置level是1for(Permission permissionNode : permissionList) {//得到頂層菜單 pid=0菜單if("0".equals(permissionNode.getPid())) {//設置頂層菜單的level是1permissionNode.setLevel(1);//根據頂層菜單,向里面進行查詢子菜單,封裝到finalNode里面finalNode.add(selectChildren(permissionNode,permissionList));}}return finalNode;}private static Permission selectChildren(Permission permissionNode, List<Permission> permissionList) {//1 因為向一層菜單里面放二層菜單,二層里面還要放三層,把對象初始化permissionNode.setChildren(new ArrayList<Permission>());//2 遍歷所有菜單list集合,進行判斷比較,比較id和pid值是否相同for(Permission it : permissionList) {//判斷 id和pid值是否相同if(permissionNode.getId().equals(it.getPid())) {//把父菜單的level值+1int level = permissionNode.getLevel()+1;it.setLevel(level);//如果children為空,進行初始化操作if(permissionNode.getChildren() == null) {permissionNode.setChildren(new ArrayList<Permission>());}//把查詢出來的子菜單放到父菜單里面permissionNode.getChildren().add(selectChildren(it,permissionList));}}return permissionNode;}下面是遞歸刪除權限的邏輯,思路是遞歸查詢該id下的所有子權限,然后批量刪除即可。
@Overridepublic void removeChildById(String id) {List<String> idList = new ArrayList<>();selectPermissionIdList(idList, id);idList.add(id);baseMapper.deleteBatchIds(idList);}private void selectPermissionIdList(List<String> idList, String id) {QueryWrapper<Permission> wrapper = new QueryWrapper<>();wrapper.eq("pid", id).select("id");List<Permission> permissionList = baseMapper.selectList(wrapper);permissionList.stream().forEach(permission -> {idList.add(permission.getId());this.selectPermissionIdList(idList, permission.getId());});}總結
以上是生活随笔為你收集整理的【深度解析RBAC用户-角色-权限设计方案,以及核心逻辑代码的讲解】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 整理Java相关的工具类Utils,持续
- 下一篇: 【Linux环境下安装Maven与环境配