RBAC、控制权限设计、权限表设计 基于角色权限控制和基于资源权限控制的区别优劣
RBAC、控制權限設計、權限表設計 基于角色權限控制和基于資源權限控制的區別優劣
- 一、介紹
- 二、基于角色的權限設計
- 三、基于資源的權限設計
- 四、主體、資源、權限關系圖
- 主體、資源、權限相關的數據模型
- 自言自語
一、介紹
現階段我們知道的大概就是兩種權限設計
接下來我給大家講一講這兩種權限的區別,以及那種更好。
在后面也會給出數據庫里表的設計的具體代碼。
二、基于角色的權限設計
RBAC基于角色的訪問控制(Role-Based Access Control)是按角色進行授權。例如:
比如:主體的角色為總經理可以查 詢企業運營報表,查詢員工工資信息等,訪問控制流程如下:
根據上圖中的判斷邏輯,授權代碼可表示如下:
if(主體.hasRole("總經理角色id")){查詢工資 }如果上圖中查詢工資所需要的角色變化為總經理和部門經理,此時就需要修改判斷邏輯為“判斷用戶的角色是否是 總經理或部門經理”,修改代碼如下:
if(主體.hasRole("總經理角色id") || 主體.hasRole("部門經理角色id")){查詢工資 }根據上邊的例子發現,當需要修改角色的權限時就需要修改授權的相關代碼,系統可擴展性差。
我們敲代碼都知道的 公司中最忌修改源碼 因為牽一發而動全身。
所以不是非常必要 就不要隨便修改原來的代碼。
接下來 我們看一下基于資源的權限控制的設計是什么樣子吧。
三、基于資源的權限設計
RBAC基于資源的訪問控制(Resource-Based Access Control)是按資源(或權限)進行授權,比如:用戶必須 具有查詢工資權限才可以查詢員工工資信息等,訪問控制流程如下:
根據上圖中的判斷,授權代碼可以表示為:
if(主體.hasPermission("查詢工資權限標識")){ 查詢工資 }優點:系統設計時定義好查詢工資的權限標識,即使查詢工資所需要的角色變化為總經理和部門經理也不需要修改 授權代碼,系統可擴展性強。
四、主體、資源、權限關系圖
主體、資源、權限相關的數據模型
主體(用戶id、賬號、密碼、…)
主體(用戶)和角色關系(用戶id、角色id、…)
角色(角色id、角色名稱、…)
角色和權限關系(角色id、權限id、…)
權限(權限id、權限標識、權限名稱、資源名稱、資源訪問地址、…)
數據模型關系圖:
具體表模型SQL:
user表:
DROP TABLE IF EXISTS `user_db`; CREATE TABLE `user_db` (`id` bigint(20) NOT NULL,`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`fullname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`mobile` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;INSERT INTO `user_db` VALUES (1, 'admin', '123456', '張三', '123');t_role表:
DROP TABLE IF EXISTS `t_role`; CREATE TABLE `t_role` (`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`role_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`create_time` datetime(0) NULL DEFAULT NULL,`update_time` datetime(0) NULL DEFAULT NULL,`status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `unique_role_name`(`role_name`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of t_role -- ---------------------------- INSERT INTO `t_role` VALUES ('1', '管理員', NULL, NULL, NULL, '');t_user_role表:
DROP TABLE IF EXISTS `t_user_role`; CREATE TABLE `t_user_role` (`user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`create_time` datetime(0) NULL DEFAULT NULL,`creator` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,PRIMARY KEY (`user_id`, `role_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of t_user_role -- ---------------------------- INSERT INTO `t_user_role` VALUES ('1', '1', NULL, NULL);t_permission表:
DROP TABLE IF EXISTS `t_permission`; CREATE TABLE `t_permission` (`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '權限標識符',`description` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',`url` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '請求地址',PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of t_permission -- ---------------------------- INSERT INTO `t_permission` VALUES ('1', 'p1', '測試資源\r\n1', '/r/r1'); INSERT INTO `t_permission` VALUES ('2', 'p2', '測試資源2', '/r/r2');t_role_permission表:
DROP TABLE IF EXISTS `t_role_permission`; CREATE TABLE `t_role_permission` (`role_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`permission_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,PRIMARY KEY (`role_id`, `permission_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of t_role_permission -- ---------------------------- INSERT INTO `t_role_permission` VALUES ('1', '1'); INSERT INTO `t_role_permission` VALUES ('2', '2');自言自語
今天又完成一篇 ?
看完這一篇 大家應該也會對權限的設計有了一些淺淺的理解吧。
一起加油哦。
總結
以上是生活随笔為你收集整理的RBAC、控制权限设计、权限表设计 基于角色权限控制和基于资源权限控制的区别优劣的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis-Plus 乐观锁 防止超
- 下一篇: Spring-Security 简介、入