本文討論一種常見的許可權控制方式: 許可權管理使用分層思想:一共分四層 1.菜單/頁面/按鈕授權 系統用戶對菜單/頁面/按鈕的可見性(不可見不代表不能訪問介面) 2.介面(功能)授權 系統用戶對介面的是否有訪問許可權 3.數據授權 系統用戶對介面有訪問許可權,但是只能操作被授權的數據.例如:商戶都能使用【訂 ...
本文討論一種常見的許可權控制方式:
許可權管理使用分層思想:一共分四層
1.菜單/頁面/按鈕授權 |
系統用戶對菜單/頁面/按鈕的可見性 |
2.介面(功能)授權 |
系統用戶對介面的是否有訪問許可權 |
3.數據授權 |
系統用戶對介面有訪問許可權,但是只能操作被授權的數據.
授權功能: 1.新建(能新建肯定可以查和改) 2.能看不能改 3.能看能改不能新建 4.根本不能看
角色自身需要功能: 1.新建(能新建肯定可以查和改)
某一個角色對另一個角色的數據有訴求: 2.能看不能改 3.能看能改不能新建 例如:role1角色能看role2角色的數據,但是不能修改其數據。
實現方式: 1.靜態業務數據配置表,例如商戶,商品等,每個表添加兩個欄位(如tbl_sapo_product表): create_role_id last_update_role_id
示例: -- 以下操作前提為相關介面均已授權 1.role1登錄進來,新建記錄,create_role_id = last_update_role_id = role1 2.role1登錄進來,role1對create_role_id = role1的數據,有增改查許可權; 3.role1對於create_role_id=role2的數據如有相關操作類型授權,可以進行相關類型的數據操作([能看不能改]或[能看能改]兩個類型),有更新操作則更新last_update_role_id=role1; (即:tbl_sapo_admin_role_rel中配置了father_role_id=role2,child_role_id=role1,func_id=【更新功能介面】)
2.對於動態業務數據表,例如訂單等,只有查/改需求
方案一(基於靜態表許可權): 動態數據表一定引用了靜態數據表,例如:訂單表中有商品id.價格id等 這些靜態數據的歸屬和授權決定了這些動態數據的歸屬和授權. 即你是該商品的創建者或者有該數據許可權,你可以查看該商品下的訂單. 以查詢訂單為例: 1.首先role1對[訂單查詢]介面有調用許可權 2.訂單中的商品id對應的商品create_role_id=role1 或者create_role_id=role2, 但是role1繼承role2數據和[訂單查詢]操作許可權 3.role1可以順利查詢. (每個介面使用哪些靜態表id由介面自己判定)
方案二(動態和靜態表授權解耦): 你有權維護(增改查)這個商店和產品,不見得你就能查看這個商店下所有產品的訂單記錄 例如:role1有許可權增改查一類門店和門店下的商品,但是他只能查看某個門店的某幾個商品的訂單信息.
以查詢訂單為例: 1.首先role1對[訂單查詢]介面有調用許可權. 2.查詢role1和[訂單查詢]操作授權了哪些商品id的集合. 3.訂單中的商品id在授權集合中則順利查詢.
方案二: 優點:是處理靜態配置表和動態業務表的介面授權完全解耦,更加靈活。
|
4.欄位授權 |
只能看見被授權的欄位 |
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET NAMES utf8 */; /*!50503 SET NAMES utf8mb4 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_account` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `login_name` varchar(255) NOT NULL COMMENT '登錄名', `login_password` varchar(255) NOT NULL COMMENT '登錄密碼', `status` int(10) unsigned NOT NULL DEFAULT 1 COMMENT '狀態:0-初始化,1-已邀請,2-已註冊', `remark` varchar(255) DEFAULT NULL COMMENT '備註', `admin_user_id` int(10) unsigned DEFAULT NULL COMMENT '管理人員id,tbl_sapo_admin_user表id', PRIMARY KEY (`id`), UNIQUE KEY `uni_idx_admin_account_login_name` (`login_name`), KEY `idx_admin_account_admin_user_id` (`admin_user_id`), CONSTRAINT `fk_admin_account_admin_user_id` FOREIGN KEY (`admin_user_id`) REFERENCES `tbl_sapo_admin_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系統管理賬戶'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_api` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `api_code` varchar(255) NOT NULL COMMENT 'api代碼', `api_path` varchar(1024) NOT NULL COMMENT 'api路徑', `api_desc` varchar(255) NOT NULL COMMENT 'api描述', `status` int(10) unsigned NOT NULL DEFAULT 1 COMMENT '狀態:0-無效,1-有效', `handle_type` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '操作類型:0-靜態數據,1-動態數據', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系統介面'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_func_api` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `func_id` int(10) unsigned NOT NULL COMMENT '系統功能id,tbl_sapo_admin_sys_func表id', `api_id` int(10) unsigned NOT NULL COMMENT '介面id,tbl_sapo_admin_api表id', `status` int(10) unsigned NOT NULL DEFAULT 1 COMMENT '狀態:0-無效,1-有效', PRIMARY KEY (`id`), KEY `idx_admin_func_api_func_id` (`func_id`), KEY `idx_admin_func_api_api_id` (`api_id`), CONSTRAINT `fk_admin_func_api_api_id` FOREIGN KEY (`api_id`) REFERENCES `tbl_sapo_admin_api` (`id`), CONSTRAINT `fk_admin_func_api_func_id` FOREIGN KEY (`func_id`) REFERENCES `tbl_sapo_admin_sys_func` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='功能api'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_handle_log` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `handle_type` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '操作類型:0-登錄', `result` int(10) unsigned NOT NULL DEFAULT 1 COMMENT '結果:0-失敗,1-成功', `admin_account_id` int(10) unsigned NOT NULL, `admin_user_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `idx_admin_handle_log_admin_account_id` (`admin_account_id`), KEY `idx_admin_handle_log_admin_user_id` (`admin_user_id`), CONSTRAINT `fk_admin_handle_log_admin_account_id` FOREIGN KEY (`admin_account_id`) REFERENCES `tbl_sapo_admin_account` (`id`), CONSTRAINT `fk_admin_handle_log_admin_user_id` FOREIGN KEY (`admin_user_id`) REFERENCES `tbl_sapo_admin_user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理員操作日誌'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_menu` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `parent_menu_id` int(10) unsigned DEFAULT NULL COMMENT '父菜單id,tbl_sapo_admin_menu表id', `name` varchar(255) DEFAULT NULL COMMENT '菜單名', `link` varchar(512) DEFAULT NULL COMMENT '菜單路徑', `icon` varchar(512) DEFAULT NULL COMMENT '菜單圖標', `status` int(10) unsigned NOT NULL DEFAULT 1 COMMENT '狀態:0-無效,1-有效', PRIMARY KEY (`id`), KEY `idx_admin_menu_parent_menu_id` (`parent_menu_id`), CONSTRAINT `fk_admin_menu_parent_menu_id` FOREIGN KEY (`parent_menu_id`) REFERENCES `tbl_sapo_admin_menu` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜單'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_role` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `role_code` varchar(255) NOT NULL COMMENT '角色編號', `role_name` varchar(255) NOT NULL COMMENT '角色名稱', `role_desc` varchar(255) DEFAULT NULL COMMENT '角色名稱', `status` int(10) unsigned NOT NULL DEFAULT 1 COMMENT '狀態:0-無效,1-有效', `super_flag` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '超級管理員標誌:0-非超級,1-超級管理員', PRIMARY KEY (`id`), UNIQUE KEY `uni_idx_admin_role_role_code` (`role_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_role_menu` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `role_id` int(10) unsigned NOT NULL COMMENT '系統角色id,tbl_sapa_admin_role表id', `menu_id` int(10) unsigned NOT NULL COMMENT '系統菜單id,tbl_sapo_admin_menu表id', `status` int(10) unsigned NOT NULL DEFAULT 1 COMMENT '狀態:0-無效,1-有效', PRIMARY KEY (`id`), KEY `idx_admin_role_menu_menu_id` (`menu_id`), KEY `idx_admin_role_menu_role_id` (`role_id`), CONSTRAINT `fk_admin_role_menu_menu_id` FOREIGN KEY (`menu_id`) REFERENCES `tbl_sapo_admin_menu` (`id`), CONSTRAINT `fk_admin_role_menu_role_id` FOREIGN KEY (`role_id`) REFERENCES `tbl_sapo_admin_role` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色菜單'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_role_rel` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `status` int(10) unsigned NOT NULL DEFAULT 1 COMMENT '狀態:0-無效,1-有效', `father_role_id` int(10) unsigned NOT NULL COMMENT '父角色id,tbl_sapo_admin_role表id', `child_role_id` int(10) unsigned NOT NULL COMMENT '子角色id,tbl_sapo_admin_role表id', `data_auth_type_id` int(10) unsigned NOT NULL COMMENT '授權類型id,tbl_sapo_admin_data_auth表id', `func_id` int(10) unsigned NOT NULL COMMENT '系統功能id,tbl_sapo_admin_sys_func表id', PRIMARY KEY (`id`), KEY `idx_admin_role_rel_father_role_id` (`father_role_id`), KEY `idx_admin_role_rel_child_role_id` (`child_role_id`), KEY `idx_admin_role_rel_func_id` (`func_id`), CONSTRAINT `fk_admin_role_rel_child_role_id` FOREIGN KEY (`child_role_id`) REFERENCES `tbl_sapo_admin_role` (`id`), CONSTRAINT `fk_admin_role_rel_father_role_id` FOREIGN KEY (`father_role_id`) REFERENCES `tbl_sapo_admin_role` (`id`), CONSTRAINT `fk_admin_role_rel_func_id` FOREIGN KEY (`func_id`) REFERENCES `tbl_sapo_admin_sys_func` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色關係(子角色能繼承父角色的數據)'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_role_sys_func` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `status` int(10) unsigned NOT NULL DEFAULT 1 COMMENT '狀態:0-無效,1-有效', `role_id` int(10) unsigned DEFAULT NULL COMMENT '角色id,tbl_sapo_admin_role表id', `func_id` int(10) unsigned DEFAULT NULL COMMENT '功能id,tbl_sapo_admin_sys_func表id', PRIMARY KEY (`id`), KEY `idx_admin_role_sys_func_role_id` (`role_id`), KEY `idx_admin_role_sys_func_func_id` (`func_id`), CONSTRAINT `fk_admin_role_sys_func_func_id` FOREIGN KEY (`func_id`) REFERENCES `tbl_sapo_admin_sys_func` (`id`), CONSTRAINT `fk_admin_role_sys_func_role_id` FOREIGN KEY (`role_id`) REFERENCES `tbl_sapo_admin_role` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色系統功能'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_sys_func` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `status` int(10) unsigned NOT NULL DEFAULT 1 COMMENT '狀態:0-無效,1-有效', `func_code` varchar(255) DEFAULT NULL COMMENT '系統功能代碼', `func_desc` varchar(255) DEFAULT NULL COMMENT '系統功能描述', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系統功能'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `nick_name` varchar(255) DEFAULT NULL COMMENT '昵稱', `name` varchar(255) NOT NULL COMMENT '姓名', `gender` int(10) unsigned NOT NULL DEFAULT 2 COMMENT '性別:0-女1-男,2-未知', `phone_no` varchar(64) NOT NULL COMMENT '手機號', `mail` varchar(255) NOT NULL COMMENT '郵箱', `status` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '狀態:0-在崗,1-停崗,2-離崗', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理人員'; CREATE TABLE IF NOT EXISTS `tbl_sapo_admin_user_role` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `create_time` datetime(3) NOT NULL COMMENT '創建時間', `last_update_time` datetime(3) DEFAULT NULL COMMENT '最後更新時間', `account_id` int(10) unsigned NOT NULL COMMENT '賬號id,tbl_sapo_admin_account表id', `role_id` int(10) unsigned NOT