日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【深度解析RBAC用户-角色-权限设计方案,以及核心逻辑代码的讲解】

發布時間:2024/10/5 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度解析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用户-角色-权限设计方案,以及核心逻辑代码的讲解】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。