关于用户权限的数据库设计
数据库权限管理中的角色与用户设计

数据库权限管理中的角色与用户设计在数据库权限管理中,角色与用户设计起着至关重要的作用。
合理的角色与用户设计能够提高数据的安全性和管理效率,保护敏感信息的机密性和完整性。
本文将为您介绍数据库权限管理中的角色与用户设计,以帮助您更好地理解和应用这一方面的知识。
首先,让我们来了解什么是角色与用户设计。
在数据库中,角色是一组共享相同权限和访问权限的用户集合。
通过将一些公共权限分配给角色,可以简化用户权限管理,提高维护效率。
而用户则是具体的个体实体,可以通过被分配到特定的角色来获得相应的权限。
在角色与用户设计中,有三个关键的方面需要考虑:角色的划分、角色的权限设置和用户的分配。
首先,角色的划分。
在设计数据库角色时,应该基于业务需求和权限层次进行划分。
一般而言,可以将角色分为超级管理员、管理员和普通用户等不同级别的角色。
超级管理员拥有数据库的最高权限,可以对数据库进行全部操作,例如创建和删除数据库等。
管理员则可以负责数据库的管理和维护,包括备份和恢复数据库、用户和角色管理等。
而普通用户则是系统的最终用户,只能进行数据的查询和操作。
接下来,是角色的权限设置。
数据库的权限通常包括数据表的查看、修改、删除和增加等操作。
不同角色应该根据业务需求来确定相应的权限。
比如,在某个角色中,只允许查看数据表的内容,而不允许进行修改和删除操作。
这样,可以避免数据的误操作和不必要的风险。
此外,需要确保权限的细分粒度,以便更好地控制数据的访问和管理。
最后,是用户的分配。
用户的分配应该根据其职责和工作需要来确定。
每个用户可以被分配到一个或多个角色中,从而获得相应的权限。
一个用户可以同时属于多个角色,这样可以根据具体的业务需求来灵活分配权限。
对于某些特殊的操作,可以通过临时提升用户的权限来满足特定的任务需求。
除了以上三个关键方面,还有一些其他的注意事项需要考虑。
首先,应该定期审查和更新角色和权限的分配。
随着业务的发展和变化,角色和权限的设计也需要随之调整。
SqlServer设置用户只能查看并访问特定数据库

SqlServer设置用户只能查看并访问特定数据库
现需要限定特定的用户只能查看并访问特定的数据库,防止多个用户对数据库操作时一些误操作。
参考i6first的如何让用户只能访问特定的数据库(MSSQL)博文
1.新建登录用户
以管理员身份登陆数据库(权限最高的身份如sa),点击安全性->登录名,右键新建登录名,输入登录名和密码,取消强制实施密码策略。
2.将服务器角色设置为public
3.将public服务器角色的属性->取消查看所有数据库的权限
点击安全性->服务器角色->public,右键属性。
点击服务器后如下图取消查看任意数据库的权限
或者执行如下SQL:
REVOKE VIEW ANY DATABASE TO [public]
4.将待授权的数据库的db_owner指派给刚注册的新用户
在数据库中新建查询,输入下列sql语句。
完成对用户权限的设定,做到了新建用户只能查看和操作特定数据库(除系统数据库外)Use [WH_R]//WH_R为数据库名称
go
EXEC dbo.sp_changedbowner N'user'//user为刚新建的用户
•1
•2
•3。
基于Python-Flask的权限管理1:框架选择和数据库设计

基于Python-Flask的权限管理1:框架选择和数据库设计⼀、前⾔我们在做任何⼀款产品的时候,或多或少都会涉及到⽤户和权限的问题。
譬如,做企业类软件,不同部门、不同职位的⼈的权限是不同的;最近想⾃⼰写⼀个⽹站,⾸先就要解决最基础的权限和菜单问题这块,在⽹上也查找了相关知识,找了⼀些开源框架模板,发现"RBAC"式的权限管理不错,于是准备以此模型为基础,完成权限管理功能。
⼆、什么是RBAC模型RBAC(Role-Based Access Control)即:基于⾓⾊的权限控制。
通过⾓⾊关联⽤户,⾓⾊关联权限的⽅式间接赋予⽤户权限。
具体可以查看三、技术选择前端:基于VUE的开源后台管理模板,我⽤的是在此基础上的另⼀个开源项⽬,已经帮我们完成了基础的前端权限管理,在此基础上改就⾏。
ps:毕竟不是前端,有现成的就⽤现成的后端:python的flask框架数据库: mysql,redis四、数据库设计1.菜单信息表:存放菜单信息CREATE TABLE `t_menu` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单ID',`menu_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单名称',`parent_id` int(11) NULL DEFAULT0 COMMENT '⽗菜单ID',`order_num` int(4) NULL DEFAULT0 COMMENT '显⽰顺序',`url` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT'#' COMMENT '请求地址',`menu_type` tinyint(4) NULL DEFAULT NULL COMMENT '菜单类型(1,⽬录 2,菜单 3,按钮)',`visible` int(1) NULL DEFAULT1 COMMENT '菜单状态(1显⽰ 2隐藏)',`perms` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限标识',`icon` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT'#' COMMENT '菜单图标',`is_frame` int(1) NULL DEFAULT2 COMMENT '是否外链',`create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT'' COMMENT '创建者',`created_at` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',`update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT'' COMMENT '更新者',`updated_at` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT'' COMMENT '备注',`route_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT'',`route_path` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT'',`route_cache` int(11) NULL DEFAULT0,`route_component` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT'',PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT =72CHARACTER SET= utf8 COLLATE = utf8_general_ci COMMENT ='菜单权限表' ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS =1;2.⾓⾊信息表:存放⾓⾊信息CREATE TABLE `t_role` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '⾓⾊ID',`role_name` VARCHAR(30) NOT NULL COMMENT '⾓⾊名称',`role_key` VARCHAR(100) NOT NULL COMMENT '⾓⾊权限字符串',`role_sort` INT(4) NOT NULL COMMENT '显⽰顺序',`data_scope` INT(1) NULL DEFAULT'1' COMMENT '数据范围(1:全部数据权限 2:⾃定数据权限)',`status` INT(1) NULL DEFAULT NULL COMMENT '⾓⾊状态(1正常 2停⽤)',`create_by` VARCHAR(64) NULL DEFAULT'' COMMENT '创建者',`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_by` VARCHAR(64) NULL DEFAULT'' COMMENT '更新者',`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`remark` VARCHAR(500) NULL DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`) USING BTREE)COMMENT='⾓⾊信息表'COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=17;3.⾓⾊和菜单关联表:存放⾓⾊和菜单关联信息CREATE TABLE `t_role_menu` (`role_id` INT(11) NOT NULL COMMENT '⾓⾊ID',`menu_id` INT(11) NOT NULL COMMENT '菜单ID',`id` INT(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`))COMMENT='⾓⾊和菜单关联表'COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=370;4.岗位信息表:存放岗位信息CREATE TABLE `t_post` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '岗位ID',`post_code` VARCHAR(64) NOT NULL COMMENT '岗位编码',`post_name` VARCHAR(50) NOT NULL COMMENT '岗位名称',`post_sort` INT(4) NOT NULL COMMENT '显⽰顺序',`status` INT(1) NOT NULL DEFAULT'1' COMMENT '状态(1正常 2停⽤)',`create_by` VARCHAR(64) NULL DEFAULT'' COMMENT '创建者',`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_by` VARCHAR(64) NULL DEFAULT'' COMMENT '更新者',`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`remark` VARCHAR(500) NULL DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`) USING BTREE)COMMENT='岗位信息表'COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=9;5.部门信息表:存放部门信息CREATE TABLE `t_dept` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '部门id',`parent_id` INT(11) NULL DEFAULT'0' COMMENT '⽗部门id',`dept_name` VARCHAR(30) NULL DEFAULT'' COMMENT '部门名称',`order_num` INT(4) NULL DEFAULT'0' COMMENT '显⽰顺序',`leader` VARCHAR(20) NULL DEFAULT NULL COMMENT '负责⼈',`phone` VARCHAR(11) NULL DEFAULT NULL COMMENT '联系电话',`email` VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',`status` INT(1) NULL DEFAULT'0' COMMENT '部门状态(1正常2停⽤)',`create_by` VARCHAR(64) NULL DEFAULT'' COMMENT '创建者',`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_by` VARCHAR(64) NULL DEFAULT'' COMMENT '更新者',`updated_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`remark` VARCHAR(500) NULL DEFAULT'' COMMENT '备注',PRIMARY KEY (`id`) USING BTREE)COMMENT='部门表'COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=12;6.⾓⾊和部门关联表:存放⾓⾊和部门关联信息CREATE TABLE `t_role_dept` (`role_id` INT(11) NOT NULL COMMENT '⾓⾊ID',`dept_id` INT(11) NOT NULL COMMENT '部门ID',`id` INT(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`))COMMENT='⾓⾊和部门关联表'COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=25;7.⽤户信息表:存放⽤户信息CREATE TABLE `t_user` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '⽤户ID',`nickname` VARCHAR(30) NULL DEFAULT NULL COMMENT '登录账号' COLLATE 'latin1_swedish_ci',`user_name` VARCHAR(30) NULL DEFAULT NULL COMMENT '⽤户昵称' COLLATE 'latin1_swedish_ci',`user_type` INT(1) NULL DEFAULT NULL COMMENT '⽤户类型(1系统⽤户',`email` VARCHAR(50) NULL DEFAULT NULL COMMENT '⽤户邮箱' COLLATE 'latin1_swedish_ci',`phone` VARCHAR(20) NULL DEFAULT NULL COMMENT '⼿机号' COLLATE 'latin1_swedish_ci',`phonenumber` VARCHAR(11) NULL DEFAULT NULL COMMENT '⼿机号码' COLLATE 'latin1_swedish_ci',`sex` INT(1) NULL DEFAULT NULL COMMENT '⽤户性别(1男 2⼥ 3未知)',`avatar` VARCHAR(100) NULL DEFAULT NULL COMMENT '头像路径' COLLATE 'latin1_swedish_ci',`password` VARCHAR(50) NULL DEFAULT NULL COMMENT '密码' COLLATE 'latin1_swedish_ci',`salt` VARCHAR(20) NULL DEFAULT NULL COMMENT '盐加密' COLLATE 'latin1_swedish_ci',`status` INT(1) NULL DEFAULT'1' COMMENT '帐号状态(1正常 2禁⽤',`dept_id` INT(11) NULL DEFAULT NULL,`del_flag` INT(1) NULL DEFAULT'1' COMMENT '删除标志(1代表存在 2代表删除)',`login_ip` VARCHAR(50) NULL DEFAULT NULL COMMENT '最后登陆IP' COLLATE 'latin1_swedish_ci',`login_date` TIMESTAMP NULL DEFAULT NULL COMMENT '最后登陆时间',`create_by` VARCHAR(64) NULL DEFAULT NULL COMMENT '创建者' COLLATE 'latin1_swedish_ci',`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_by` VARCHAR(64) NULL DEFAULT NULL COMMENT '更新者' COLLATE 'latin1_swedish_ci',`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted_at` TIMESTAMP NULL DEFAULT NULL COMMENT '更新时间',`remark` VARCHAR(500) NULL DEFAULT NULL COMMENT '备注' COLLATE 'latin1_swedish_ci',PRIMARY KEY (`id`))COMMENT='⽤户信息表'COLLATE='utf32_general_ci'ENGINE=InnoDBAUTO_INCREMENT=11;8.⽤户与岗位关联表:存放⽤户与岗位关联信息CREATE TABLE `t_user_post` (`user_id` INT(11) NOT NULL COMMENT '⽤户ID',`post_id` INT(11) NOT NULL COMMENT '岗位ID',`id` INT(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`))COMMENT='⽤户与岗位关联表'COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=5;9.⽤户和⾓⾊关联表:存放⽤户和⾓⾊关联信息CREATE TABLE `t_user_role` (`user_id` INT(11) NOT NULL COMMENT '⽤户ID',`role_id` INT(11) NOT NULL COMMENT '⾓⾊ID',`id` INT(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`))COMMENT='⽤户和⾓⾊关联表'COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=18;10.字典类型表:存放字典类型CREATE TABLE `t_dict_type` (`id` INT(11) NOT NULL AUTO_INCREMENT,`dict_name` VARCHAR(100) NULL DEFAULT'' COMMENT '字典名称',`dict_type` VARCHAR(100) NULL DEFAULT'' COMMENT '字典类型',`dict_value_type` INT(11) NULL DEFAULT'0' COMMENT '标识',`status` INT(1) NULL DEFAULT'1' COMMENT '状态(1正常 2停⽤)',`create_by` VARCHAR(64) NULL DEFAULT'' COMMENT '创建者',`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_by` VARCHAR(64) NULL DEFAULT'' COMMENT '更新者',`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`remark` VARCHAR(500) NULL DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`),UNIQUE INDEX `dict_type` (`dict_type`))COMMENT='字典类型表'COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=27;11.字典数据表:存放字典数据CREATE TABLE `t_dict_data` (`dict_id` INT(11) NOT NULL COMMENT 'ID',`id` INT(11) NOT NULL AUTO_INCREMENT,`dict_sort` INT(4) NULL DEFAULT'0' COMMENT '字典排序',`dict_label` VARCHAR(100) NULL DEFAULT'' COMMENT '字典标签',`dict_value` VARCHAR(100) NULL DEFAULT'' COMMENT '字典键值',`dict_number` INT(11) NULL DEFAULT'0' COMMENT '字典值',`dict_type` VARCHAR(100) NULL DEFAULT'' COMMENT '字典类型',`dict_value_type` INT(11) NULL DEFAULT'1' COMMENT 'dict_value_type',`css_class` VARCHAR(100) NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)',`list_class` VARCHAR(100) NULL DEFAULT NULL COMMENT '表格回显样式',`is_default` INT(1) NULL DEFAULT'1' COMMENT '是否默认(1是 0否)',`status` INT(1) NULL DEFAULT'1' COMMENT '状态(1正常 2停⽤)',`create_by` VARCHAR(64) NULL DEFAULT'' COMMENT '创建者',`created_at` TIMESTAMP NULL DEFAULT NULL COMMENT '创建时间',`update_by` VARCHAR(64) NULL DEFAULT'' COMMENT '更新者',`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`remark` VARCHAR(500) NULL DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`) USING BTREE)COMMENT='字典数据表'COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=29;12.参数配置表:存放可变参数CREATE TABLE `t_configs` (`id` INT(5) NOT NULL AUTO_INCREMENT COMMENT '参数主键',`config_name` VARCHAR(100) NULL DEFAULT'' COMMENT '参数名称',`config_key` VARCHAR(100) NULL DEFAULT'' COMMENT '参数键名',`config_value` VARCHAR(100) NULL DEFAULT'' COMMENT '参数键值',`config_type` INT(1) NULL DEFAULT'1' COMMENT '系统内置(1是 2否)',`create_by` VARCHAR(11) NULL DEFAULT NULL COMMENT '创建者',`update_by` VARCHAR(11) NULL DEFAULT NULL COMMENT '更新着',`created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`remark` VARCHAR(500) NULL DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`) USING BTREE)COMMENT='参数配置表'COLLATE='utf8_general_ci'ENGINE=InnoDBAUTO_INCREMENT=8;五、基础数据-- ------------------------------ Records of t_configs-- ----------------------------INSERT INTO `t_configs` VALUES ('1', '⽤户管理 - 账号初始密码', 'er.initPassword', '123456', '1', null, 'admin', '2020-03-22 14:01:59', '2020-03-22 14:38:28', null);-- ------------------------------ Records of t_dept-- ----------------------------INSERT INTO `t_dept` VALUES ('1', '0', '公司', '1', '狄云', '138********', 'gs@', '1', '', null, 'admin', '2020-03-18 23:10:41', '3333');INSERT INTO `t_dept` VALUES ('2', '1', '研发', '0', null, null, null, '1', '', null, '', '2020-03-18 22:29:17', '');INSERT INTO `t_dept` VALUES ('3', '2', '研发组1', '0', null, null, null, '1', '', null, '', '2020-03-18 22:29:16', '');INSERT INTO `t_dept` VALUES ('7', '0', '外包', '1', 'wb', '', '', '2', 'admin', '2020-03-19 21:10:05', 'admin', '2020-03-22 17:42:13', '');INSERT INTO `t_dept` VALUES ('8', '1', '运维', '1', '', '', '', '1', 'admin', '2020-03-22 18:58:57', null, null, '');INSERT INTO `t_dept` VALUES ('9', '8', '运维⼀组', '1', '', '', '', '1', 'admin', '2020-03-22 18:59:08', null, null, '');INSERT INTO `t_dept` VALUES ('10', '7', '外包⼀部', '1', '', '', '', '1', 'admin', '2020-03-22 18:59:17', null, null, '');INSERT INTO `t_dept` VALUES ('11', '7', '外包⼆部', '1', '', '', '', '1', 'admin', '2020-03-22 18:59:23', null, null, '');-- ------------------------------ Records of t_dict_data-- ----------------------------INSERT INTO `t_dict_data` VALUES ('1', '1', '1', '字符', '', '2', 'dict_value_type', '1', null, null, '1', '1', '', null, '', '2020-03-17 23:13:37', null);INSERT INTO `t_dict_data` VALUES ('1', '2', '2', '数字', '', '1', 'dict_value_type', '1', null, null, '1', '1', '', null, '', null, null);INSERT INTO `t_dict_data` VALUES ('3', '3', '1', '按钮', '', '2', 'menu_type', '1', null, null, '1', '1', '', null, '', null, null);INSERT INTO `t_dict_data` VALUES ('3', '4', '2', '菜单', '', '1', 'menu_type', '1', null, null, '1', '1', '', null, '', null, null);INSERT INTO `t_dict_data` VALUES ('5', '5', '1', '隐藏', '', '2', 'visible', '1', null, null, '1', '1', '', null, '', null, null);INSERT INTO `t_dict_data` VALUES ('5', '6', '2', '显⽰', '', '1', 'visible', '1', null, null, '1', '1', '', null, '', '2020-03-16 21:50:01', null);INSERT INTO `t_dict_data` VALUES ('4', '7', '1', '否', '', '2', 'is', '1', null, null, '1', '1', '', null, '', '2020-03-16 21:50:02', null);INSERT INTO `t_dict_data` VALUES ('4', '8', '2', '是', '', '1', 'is', '1', null, null, '1', '1', '', null, '', '2020-03-16 21:50:03', null);INSERT INTO `t_dict_data` VALUES ('7', '9', '1', '禁⽤', '', '2', 'status', '1', null, null, '1', '1', '', null, '', '2020-03-16 21:50:53', null);INSERT INTO `t_dict_data` VALUES ('7', '10', '2', '激活', '', '1', 'status', '1', null, null, '1', '1', '', null, '', '2020-03-16 21:51:21', null);INSERT INTO `t_dict_data` VALUES ('6', '17', '1', '男', '', '1', 'sex', '1', '', '', '1', '1', null, null, null, '2020-03-20 12:15:10', '');INSERT INTO `t_dict_data` VALUES ('6', '18', '1', '⼥', '', '2', 'sex', '1', '', '', '1', '1', null, null, null, '2020-03-20 12:15:12', '');INSERT INTO `t_dict_data` VALUES ('25', '23', '1', '全部', '', '1', 'data_scope', null, '', '', '1', '1', 'admin', null, null, '2020-03-20 12:14:42', '');INSERT INTO `t_dict_data` VALUES ('25', '24', '1', '⾃定义', '', '2', 'data_scope', null, '', '', '1', '1', 'admin', null, null, '2020-03-20 12:36:21', '');-- ------------------------------ Records of t_dict_type-- ----------------------------INSERT INTO `t_dict_type` VALUES ('1', '字典值类型', 'dict_value_type', '1', '1', '', null, '', null, null);INSERT INTO `t_dict_type` VALUES ('3', '菜单类型', 'menu_type', '1', '1', '', null, '', null, null);INSERT INTO `t_dict_type` VALUES ('4', '是否', 'is', '1', '1', '', null, '', null, null);INSERT INTO `t_dict_type` VALUES ('5', '显⽰状态', 'visible', '1', '1', '', null, '', null, null);INSERT INTO `t_dict_type` VALUES ('6', '性别', 'sex', '1', '1', '', null, '', null, null);INSERT INTO `t_dict_type` VALUES ('7', '状态', 'status', '1', '2', '', null, '', '2020-03-17 18:54:00', null);INSERT INTO `t_dict_type` VALUES ('25', '数据权限', 'data_scope', '1', '1', 'admin', '2020-03-20 01:03:55', null, '2020-03-20 01:03:55', '');-- ------------------------------ Records of t_menu-- ----------------------------INSERT INTO `t_menu` VALUES ('1', '系统管理', '0', '1', '#', '1', '1', null, 'cog', '2', '', null, '', null, '', '', '', '0', '');INSERT INTO `t_menu` VALUES ('2', '菜单管理', '1', '1', '/management/menu', '1', '1', '', 'navicon', '2', '', null, '', '2020-03-16 21:34:11', '', 'management-menu', 'management/menu', '2', 'management/menu');INSERT INTO `t_menu` VALUES ('3', '菜单查询', '2', '0', '#', '2', '1', 'system:menu:query', '#', '0', '', null, '', null, '', '', '', '0', '');INSERT INTO `t_menu` VALUES ('4', '菜单删除', '2', '0', '#', '2', '1', 'system:menu:remove', '#', '0', '', null, '', null, '', '', '', '0', '');INSERT INTO `t_menu` VALUES ('5', '菜单新增', '2', '0', '#', '2', '1', 'system:menu:add', '#', '0', '', null, '', null, '', '', '', '0', '');INSERT INTO `t_menu` VALUES ('6', '菜单修改', '2', '0', '#', '2', '1', 'system:menu:edit', '#', '0', '', null, '', '2020-03-15 15:45:28', '', '', '', '0', '');INSERT INTO `t_menu` VALUES ('22', '⽤户管理', '1', '2', '/management/user', '1', '1', '', 'user-circle', '2', '1', '2020-03-16 20:48:06', null, '2020-03-16 21:34:31', '', 'management-user', 'management/user', '2', 'management/user');INSERT INTO `t_menu` VALUES ('23', '⽤户查询', '22', '1', null, '2', '1', 'system:user:query', null, null, '1', '2020-03-16 20:49:26', null, '2020-03-16 20:55:31', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('24', '⽤户新增', '22', '1', null, '2', null, 'system:user:add', null, null, '1', '2020-03-16 21:03:36', null, '2020-03-16 21:03:36', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('25', '⽤户修改', '22', '1', null, '2', null, 'system:user:edit', null, null, '1', '2020-03-16 21:08:26', null, '2020-03-16 21:08:26', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('26', '⽤户删除', '22', '1', null, '2', null, 'system:user:remove', null, null, '1', '2020-03-16 21:08:39', null, '2020-03-16 21:08:39', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('27', '⾓⾊管理', '1', '3', '/management/role', '1', '1', '', 'users', '2', '1', '2020-03-16 21:10:32', null, '2020-03-16 21:34:42', '', 'management-role', 'management/role', '2', 'management/role');INSERT INTO `t_menu` VALUES ('28', '⾓⾊查询', '27', '1', null, '2', null, 'system:role:query', null, null, '1', '2020-03-16 21:10:58', null, '2020-03-16 21:10:58', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('29', '⾓⾊添加', '27', '1', null, '2', null, 'system:role:add', null, null, '1', '2020-03-16 21:11:27', null, '2020-03-16 21:11:27', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('30', '⾓⾊修改', '27', '1', null, '2', null, 'system:role:edit', null, null, '1', '2020-03-16 21:11:38', null, '2020-03-16 21:11:38', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('31', '⾓⾊删除', '27', '1', null, '2', null, 'system:role:remove', null, null, '1', '2020-03-16 21:11:51', null, '2020-03-16 21:11:51', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('32', '⾓⾊修改-数据权限', '27', '1', null, '2', null, 'system:role:editData', null, null, '1', '2020-03-16 21:13:04', null, '2020-03-16 21:13:04', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('33', '部门管理', '1', '4', '/management/dept', '1', '1', '', 'bank', '2', '1', '2020-03-16 21:14:52', null, '2020-03-16 21:33:49', '', 'management-dept', 'management/dept', '2', 'management/dept');INSERT INTO `t_menu` VALUES ('34', '部门查询', '33', '1', null, '2', null, 'system:dept:query', null, null, '1', '2020-03-16 21:15:21', null, '2020-03-16 21:15:21', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('35', '部门新增', '33', '1', null, '2', null, 'system:dept:add', null, null, '1', '2020-03-16 21:16:10', null, '2020-03-16 21:16:10', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('36', '部门修改', '33', '1', null, '2', null, 'system:dept:edit', null, null, '1', '2020-03-16 21:16:21', null, '2020-03-16 21:16:21', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('37', '部门删除', '33', '1', null, '2', null, 'system:dept:remove', null, null, '1', '2020-03-16 21:16:35', null, '2020-03-16 21:16:35', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('38', '岗位管理', '1', '5', '/management/post', '1', '1', '', 'briefcase', '2', '1', '2020-03-16 21:18:27', null, '2020-03-16 21:34:58', '', 'management-post', 'management/post', '2', 'management/post');INSERT INTO `t_menu` VALUES ('39', '岗位查询', '38', '1', null, '2', null, 'system:post:query', null, null, '1', '2020-03-16 21:18:50', null, '2020-03-16 21:18:50', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('40', '岗位增加', '38', '1', null, '2', null, 'system:post:add', null, null, '1', '2020-03-16 21:19:06', null, '2020-03-16 21:19:06', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('41', '岗位修改', '38', '1', null, '2', null, 'system:post:edit', null, null, '1', '2020-03-16 21:19:26', null, '2020-03-16 21:19:26', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('42', '岗位删除', '38', '1', null, '2', null, 'system:post:remove', null, null, '1', '2020-03-16 21:19:41', null, '2020-03-16 21:19:41', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('43', '字典管理', '1', '6', '/management/dict', '1', '1', '', 'book', '2', '1', '2020-03-16 21:20:33', null, '2020-03-16 21:35:11', '', 'management-dict', 'management/dict', '2', 'management/dict');INSERT INTO `t_menu` VALUES ('44', '字典查询', '43', '1', null, '2', null, 'system:dict:query', null, null, '1', '2020-03-16 21:21:20', null, '2020-03-16 21:21:20', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('45', '字典新增', '43', '1', null, '2', null, 'system:dict:add', null, null, '1', '2020-03-16 21:21:40', null, '2020-03-16 21:21:40', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('46', '字典修改', '43', '1', null, '2', null, 'system:dict:edit', null, null, '1', '2020-03-16 21:21:59', null, '2020-03-16 21:21:59', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('47', '字典删除', '43', '1', null, '2', null, 'system:dict:remove', null, null, '1', '2020-03-16 21:22:22', null, '2020-03-16 21:22:22', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('48', '字典详情', '43', '1', null, '2', null, 'system:dict:detail', null, null, '1', '2020-03-16 21:23:00', null, '2020-03-16 21:23:00', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('49', '字典数据', '1', '7', '/management/dict-data', '1', '2', '', '', null, '1', '2020-03-16 21:25:19', null, '2020-03-16 23:30:52', '', 'management-dict-data', 'management/dict-data', '2', 'management/dict-data'); INSERT INTO `t_menu` VALUES ('50', '字典数据查询', '49', '1', null, '2', null, 'system:dict-data:query', null, null, '1', '2020-03-16 21:25:45', null, '2020-03-16 21:25:45', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('51', '字典数据新增', '49', '1', null, '2', null, 'system:dict-data:add', null, null, '1', '2020-03-16 21:26:01', null, '2020-03-16 21:26:01', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('52', '字典数据修改', '49', '1', null, '2', null, 'system:dict-data:edit', null, null, '1', '2020-03-16 21:26:15', null, '2020-03-16 21:26:15', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('53', '字典数据删除', '49', '1', null, '2', null, 'system:dict-data:remove', null, null, '1', '2020-03-16 21:26:27', null, '2020-03-16 21:26:27', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('54', '参数设置', '1', '8', '/management/config', '1', '1', '', 'cubes', '2', '1', '2020-03-16 21:28:00', null, '2020-03-16 21:35:26', '', 'management-config', 'management/config', '1', 'management/config'); INSERT INTO `t_menu` VALUES ('55', '参数查询', '54', '1', null, '2', null, 'system:config:query', null, null, '1', '2020-03-16 21:28:23', null, '2020-03-16 21:28:23', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('56', '参数添加', '54', '1', null, '2', null, 'system:config:add', null, null, '1', '2020-03-16 21:28:33', null, '2020-03-16 21:28:33', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('57', '参数修改', '54', '1', null, '2', null, 'system:config:edit', null, null, '1', '2020-03-16 21:28:57', null, '2020-03-16 21:28:57', '', null, null, null, null);INSERT INTO `t_menu` VALUES ('58', '参数删除', '54', '1', null, '2', null, 'system:config:remove', null, null, '1', '2020-03-16 21:29:09', null, '2020-03-16 21:29:09', '', null, null, null, null);-- ------------------------------ Records of t_post-- ----------------------------INSERT INTO `t_post` VALUES ('5', 'dev-server', '后端开发⼯程师', '2', '1', 'admin', '2020-03-18 21:55:28', 'admin', '2020-03-18 22:02:06', '');INSERT INTO `t_post` VALUES ('6', 'dev-web', '前端开发⼯程师', '3', '1', 'admin', '2020-03-18 21:55:42', 'admin', '2020-03-18 22:02:12', '');INSERT INTO `t_post` VALUES ('7', 'pm', '产品经理', '4', '1', 'admin', '2020-03-18 21:55:56', 'admin', '2020-03-18 22:02:22', '');INSERT INTO `t_post` VALUES ('8', 'ui', 'UI 设计', '1', '1', 'admin', '2020-03-18 21:56:15', null, '2020-03-18 21:56:15', '');-- ------------------------------ Records of t_role-- ----------------------------INSERT INTO `t_role` VALUES ('1', '管理员', 'admin', '1', '1', '1', '', '2020-03-19 21:42:11', 'admin', '2020-03-21 19:20:44', null);INSERT INTO `t_role` VALUES ('16', '游客', 'guide', '1', '1', '1', 'admin', '2020-03-21 19:31:41', null, '2020-03-21 19:31:41', '');-- ------------------------------ Records of t_role_dept-- ----------------------------INSERT INTO `t_role_dept` VALUES ('1', '1', '1');-- ------------------------------ Records of t_role_menu-- ----------------------------INSERT INTO `t_role_menu` VALUES ('1', '1', '1');-- ------------------------------ Records of t_user-- ----------------------------INSERT INTO `t_user` VALUES ('1', 'admin', 'admin', null, 'admin@', '188********', null, '1', null, 'eb7c670dbd05eafe15b8fa94059b3069', null, '1', '1', '1', '127.0.0.1', '2020-03-21 17:25:27', null, null, 'admin', '2020-03-21 17:25:27 -- ------------------------------ Records of t_user_post-- ----------------------------INSERT INTO `t_user_post` VALUES ('1', '1', '1');-- ------------------------------ Records of t_user_role-- ----------------------------INSERT INTO `t_user_role` VALUES ('1', '1', '1');View Code。
基于C_RBAC模型的SAPISP系统权限管理数据库设计

基于C_RBAC模型的SAPISP系统权限管理数据库设计作者:郑建华朱蓉邱振国来源:《电脑知识与技术》2014年第34期摘要:为了实现罗定市特色农产品信息服务平台(SAPISP: Special Agriculture Product Information Service Platform)的权限管理,分析了RBAC96模型应用的局限性,随后提出C_RBAC模型,该模型通过建立权限的约束以及权限与用户的弱关联,实现了权限的精细化和动态化管理。
并针对SAPISP系统特点,该文设计了基于C_RBAC模型的权限管理数据库,该设计较好的满足了SAPISP权限管理需求。
关键词:权限管理;RBAC;C_RBAC;角色中图分类号:TP309.2 文献标识码:A 文章编号:1009-3044(2014)34-8101-03当今各行各业已经进入全面信息时代,农业信息化成为中国的重大国策[1]。
罗定市特色农产品信息服务平台(SAPISP: Special Agriculture Product Information Service Platform)是一个面向培训企业或者科研单位、农业技术专家、农产品生产企业、农户等多用户的集农产品生产、加工、流通、生产技术培训等多功能一体的综合性信息服务平台。
该平台的建设对于发展现代农业,优化农业产业结构,提升农业整体素质,创新农业经营模式,具有重大而积极的意义。
信息服务平台的关键要素之一是信息安全,而访问控制技术是实现信息安全的重要基础,即只有经过授权的用户才能对特定数据进行访问和使用,这样才能有效的实现数据的保密性、完整性和可用性[2]。
SAPISP实现4个服务子系统,包括科技培训服务子系统、特色农产品生产服务子系统、特色农产品流通服务子系统、特色农产品行业资讯子系统,其参与成员众多,不同人员的功能不一样,因此设计合理的权限控制模型,保证信息安全是实现该平台的重要前提。
基于角色的访问控制[3](RBAC:Role-Based Access Control)在上个世纪后期提出后得到广泛应用[4-6],其中最为经典的是RBAC96[3]模型。
用户权限管理设计方案

用户权限管理设计方案用户认证管理设计方案1 设计思路为了设计一套具有较强可扩展性的用户认证管理,需要建立用户、角色和权限等数据库表,并且建立之间的关系,具体实现如下。
1.1 用户用户仅仅是纯粹的用户,用来记录用户相关信息,如用户名、密码等,权限是被分离出去了的。
用户(User)要拥有对某种资源的权限,必须通过角色(Role)去关联。
用户通常具有以下属性:编号,在系统中唯一。
名称,在系统中唯一。
用户口令。
注释,描述用户或角色的信息。
1.2 角色角色是使用权限的基本单位,拥有一定数量的权限,通过角色赋予用户权限,通常具有以下属性:编号,在系统中唯一。
名称,在系统中唯一。
注释,描述角色信息1.3 权限权限指用户根据角色获得对程序某些功能的操作,例如对文件的读、写、修改和删除功能,通常具有以下属性:编号,在系统中唯一。
名称,在系统中唯一。
注释,描述权限信息1.4 用户与角色的关系一个用户(User)可以隶属于多个角色(Role),一个角色组也可拥有多个用户,用户角色就是用来描述他们之间隶属关系的对象。
用户(User)通过角色(Role)关联所拥有对某种资源的权限,例如用户(User):UserID UserName UserPwd1 张三xxxxxx2 李四xxxxxx……角色(Role):RoleID RoleName RoleNote01 系统管理员监控系统维护管理员02 监控人员在线监控人员03 调度人员调度工作人员04 一般工作人员工作人员……用户角色(User_Role):UserRoleID UserID RoleID UserRoleNote1 1 01 用户“张三”被分配到角色“系统管理员”2 2 02 用户“李四”被分配到角色“监控人员”3 2 03 用户“李四”被分配到角色“调度人员”……从该关系表可以看出,用户所拥有的特定资源可以通过用户角色来关联。
1.5 权限与角色的关系一个角色(Role)可以拥有多个权限(Permission),同样一个权限可分配给多个角色。
权限系统设计五张表

权限系统设计五张表在进行权限系统设计时,一项十分重要的任务是设计适当的数据库表结构。
数据库表的设计决定了系统的灵活性、效率和数据的完整性。
本文将介绍一个权限系统的设计,包括五张表的设计和结构。
表一:用户表(User)该表用于存储系统中的用户信息。
它包含以下字段:1. 用户ID(UserID):用于唯一标识每个用户的ID。
2. 用户名(Username):用户的登录名。
3. 密码(Password):用户的密码,需要进行加密存储。
4. 姓名(Name):用户的真实姓名。
5. 邮箱(Email):用户的电子邮箱地址。
6. 手机号码(PhoneNumber):用户的手机号码。
表二:角色表(Role)角色表用于存储系统中的角色信息,该表包含以下字段:1. 角色ID(RoleID):用于唯一标识每个角色的ID。
2. 角色名称(RoleName):角色的名称,如管理员、普通用户等。
3. 角色描述(RoleDescription):对角色进行详细描述。
表三:权限表(Permission)权限表用于存储系统中的权限信息,该表包含以下字段:1. 权限ID(PermissionID):用于唯一标识每个权限的ID。
2. 权限名称(PermissionName):权限的名称,如查看、编辑等。
3. 权限描述(PermissionDescription):对权限进行详细描述。
表四:角色-权限关联表(RolePermission)角色-权限关联表用于记录角色和权限之间的关系,该表包含以下字段:1. 关联ID(ID):用于唯一标识每个角色-权限关联的ID。
2. 角色ID(RoleID):与角色表中的角色ID关联。
3. 权限ID(PermissionID):与权限表中的权限ID关联。
表五:用户-角色关联表(UserRole)用户-角色关联表用于记录用户和角色之间的关系,该表包含以下字段:1. 关联ID(ID):用于唯一标识每个用户-角色关联的ID。
如何设计数据库表实现完整的RBAC(基于角色权限控制)

如何设计数据库表实现完整的RBAC(基于角色权限控制)[转]2007-11-04 14:15RBAC(基于角色的权限控制)是一个老话题了,但是这两天我试图设计一套表结构实现完整的RBAC时,发现存在很多困难。
我说的完整的RBAC,是指支持角色树形结构和角色分组。
具体来说,应当包含如下权限控制需求:父级角色可以访问甚至是修改其子级的数据,包含直接子级直到最终子级。
角色可以访问其所在组的数据。
父级角色可以访问其所有子级(从直接子级到最终子级)所在组的数据。
而具体到我的系统中,还应当有如下需求。
兼容多种数据库产品。
只能用简单的表,视图,存储过程和函数等实现。
同时兼容单条数据处理和批量数据处理的需求。
且不论这些具体需求,RBAC的基本表应当如下四个:roleList表,记录所有的角色和角色组。
roleId: PK, 角色/组的ID,全局唯一,不区分角色和组。
roleName:角色/组的名称。
roleType: R - 角色,G - 组rolePermission表,记录每一个角色/组对每一个对象的权限。
permissionID: PK, 无特定意义。
role: 角色/组的ID。
object: 对象的ID。
permission: 权限标识,如读,写,删等。
roleRelationship表,记录角色/组之间的关系。
relationId: PK, 无特定意义。
superiorRole: 父角色/组的ID。
role:子角色,子组,成员角色,成员组的ID。
relationship: 关系标识,可在如下设置集中选取一个。
PG标识:P - 父子关系,G - 组/成员关系。
PPGG标识:在PG集上,再加三种:PP - 间接父级关系,GG - 组内组关系,CG - parentRole 是组,childRole的子角色或间接子角色是其成员,或其子组(含间接子组)的成员objectList表,记录所有的对象。
objectId: PK,对象ID,全局唯一。
用户权限管理数据库设计(RBAC)

⽤户权限管理数据库设计(RBAC) RBAC(Role-Based Access Control,基于⾓⾊的访问控制),就是⽤户通过⾓⾊与权限进⾏关联。
简单地说,⼀个⽤户拥有若⼲⾓⾊,每⼀个⾓⾊拥有若⼲权限。
这样,就构造成“⽤户-⾓⾊-权限”的授权模型。
在这种模型中,⽤户与⾓⾊之间,⾓⾊与权限之间,⼀般者是多对多的关系。
(如下图) ⾓⾊是什么?可以理解为⼀定数量的权限的集合,权限的载体。
例如:⼀个论坛系统,“超级管理员”、“版主”都是⾓⾊。
版主可管理版内的帖⼦、可管理版内的⽤户等,这些是权限。
要给某个⽤户授予这些权限,不需要直接将权限授予⽤户,可将“版主”这个⾓⾊赋予该⽤户。
当⽤户的数量⾮常⼤时,要给系统每个⽤户逐⼀授权(授⾓⾊),是件⾮常烦琐的事情。
这时,就需要给⽤户分组,每个⽤户组内有多个⽤户。
除了可给⽤户授权外,还可以给⽤户组授权。
这样⼀来,⽤户拥有的所有权限,就是⽤户个⼈拥有的权限与该⽤户所在⽤户组拥有的权限之和。
(下图为⽤户组、⽤户与⾓⾊三者的关联关系) 在应⽤系统中,权限表现成什么?对功能模块的操作,对上传⽂件的删改,菜单的访问,甚⾄页⾯上某个按钮、某个图⽚的可见性控制,都可属于权限的范畴。
有些权限设计,会把功能操作作为⼀类,⽽把⽂件、菜单、页⾯元素等作为另⼀类,这样构成“⽤户-⾓⾊-权限-资源”的授权模型。
⽽在做数据表建模时,可把功能操作和资源统⼀管理,也就是都直接与权限表进⾏关联,这样可能更具便捷性和易扩展性。
(见下图) 请留意权限表中有⼀列“权限类型”,我们根据它的取值来区分是哪⼀类权限,如“MENU”表⽰菜单的访问权限、“OPERATION”表⽰功能模块的操作权限、“FILE”表⽰⽂件的修改权限、“ELEMENT”表⽰页⾯元素的可见性控制等。
这样设计的好处有⼆。
其⼀,不需要区分哪些是权限操作,哪些是资源,(实际上,有时候也不好区分,如菜单,把它理解为资源呢还是功能模块权限呢?)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1设计思路为了设计一套具有较强可扩展性的用户认证管理,需要建立用户、角色和权限等数据库表,并且建立之间的关系,具体实现如下。
1.1用户用户仅仅是纯粹的用户,用来记录用户相关信息,如用户名、密码等,权限是被分离出去了的。
用户(User)要拥有对某种资源的权限,必须通过角色(Role)去关联。
用户通常具有以下属性:编号,在系统中唯一。
ü名称,在系统中唯一。
ü用户口令。
ü注释,描述用户或角色的信息。
1.2角色角色是使用权限的基本单位,拥有一定数量的权限,通过角色赋予用户权限,通常具有以下属性:ü编号,在系统中唯一。
ü名称,在系统中唯一。
ü注释,描述角色信息1.3权限权限指用户根据角色获得对程序某些功能的操作,例如对文件的读、写、修改和删除功能,通常具有以下属性:ü编号,在系统中唯一。
ü名称,在系统中唯一。
ü注释,描述权限信息1.4用户与角色的关系一个用户(User)可以隶属于多个角色(Role),一个角色组也可拥有多个用户,用户角色就是用来描述他们之间隶属关系的对象。
用户(User)通过角色(Role)关联所拥有对某种资源的权限,例如l用户(User):UserID UserName UserPwd1张三xxxxxx2李四xxxxxx……l角色(Role):RoleID RoleName RoleNote01系统管理员监控系统维护管理员02监控人员在线监控人员03调度人员调度工作人员04一般工作人员工作人员……从该关系表可以看出,用户所拥有的特定资源可以通过用户角色来关联。
1.5权限与角色的关系一个角色(Role)可以拥有多个权限(Permission),同样一个权限可分配给多个角色。
例如:l角色(Role):RoleID RoleName RoleNote01系统管理员监控系统维护管理员02监控人员在线监控人员03调度人员调度工作人员04一般工作人员工作人员……l权限(Permission):PermissionID PermissionName PermissionNote0001增加监控允许增加监控对象0002修改监控允许修改监控对象0003删除监控允许删除监控对象0004察看监控信息允许察看监控对象……l角色权限(Role_Permission):RolePermissionID RoleID PermissionID RolePermissionNote1010001角色“系统管理员”具有权限“增加监控”2010002角色“系统管理员”具有权限“修改监控”3010003角色“系统管理员”具有权限“删除监控”4010004角色“系统管理员”具有权限“察看监控”5020001角色“监控人员”具有权限“增加监控”6020004角色“监控人员”具有权限“察看监控”……由以上例子中的角色权限关系可以看出,角色权限可以建立角色和权限之间的对应关系。
1.6建立用户权限用户权限系统的核心由以下三部分构成:创造权限、分配权限和使用权限。
第一步由Creator创造权限(Permission),Creator在设计和实现系统时会划分。
利用存储过程CreatePermissionInfo(@PermissionName,@PermissionNote)创建权限信息,指定系统模块具有哪些权限。
第二步由系统管理员(Administrator)创建用户和角色,并且指定用户角色(User-Role)和角色权限(Role-Permission)的关联关系。
1)具有创建用户、修改用户和删除用户的功能:Administratorl存储过程CreateUserInfo(@UserName,@UserPwd)创建用户信息;l存储过程ModifyUserInfo(@UserName,@UserPwd)修改用户信息;l存储过程DeleteUserInfo(@UserID)删除用户信息;2)具有创建角色和删除角色的功能:Administratorl存储过程CreateRoleInfo(@RoleName,@RoleNote)创建角色信息;l存储过程DeleteRoleInfo(@RoleID)删除角色信息;3)Administrator具有建立用户和角色、角色和权限的关联关系功能:l存储过程GrantUserRole(@UserID,@RoleID,@UserRoleNote)建立用户和角色的关联关系;l存储过程DeleteUserRole(@UserRoleID)删除用户和角色的关联关系;l存储过程GrantRolePermission(@RoleID,@PermissionID,@RolePermissionNote)建立角色和权限的关联关系;l存储过程DeleteRolePermission(@RolePermissionID)删除角色和权限的关联关系;第三步用户(User)使用Administrator分配给的权限去使用各个系统模块。
利用存储过程GetUserRole(@UserID,@UserRoleID output),GetRolePermission(@RoleID,@Role- -PermissinID output)获得用户对模块的使用权限。
1.7用户认证实现当用户通过验证后,由系统自动生成一个128位的TicketID保存到用户数据库表中,建立存储过程Login(@UserID,@UserPwd,@TicketID output)进行用户认证,认证通过得到一个TicketID,否则TicketID为null。
其流程图如下:图1Login流程图得到TicketID后,客户端在调用服务端方法时传递TicketID,通过存储过程JudgeTicketPermission(@TicketID,@PermissionID)判断TicketID对应的用户所具有的权限,并根据其权限进行方法调用。
当用户退出系统时,建立存储过程Logout(@UserID)来退出系统。
当用户异常退出系统时,根据最后的登陆时间(LastSignTime)确定用户的TickeID,建立存储过程ExceptionLogout (@UserID,@LastSignTime)处理用户的异常退出。
图2Logout流程图WebService可以采用SoapHeader中写入TicketID来使得TicketID从客户端传递给服务端。
.Net Remoting可以采用CallContext类来实现TicketID从客户端传递给服务端。
2数据库设计2.1数据库表图3数据库关系图2.2数据库表说明2.2.1用户表(Static_User)Static_User Static_User字段名详细解释类型备注UserID路线编号varchar(20) PKUserName用户名称varchar(20)UserPwd用户密码varchar(20)LastSignTime最后登陆时间datatimeSignState用户登陆状态标记intTickeID验证票记录编号varchar(128)2.2.2角色表(Static_Role)Static_Role Static_User字段名详细解释类型备注RoleID角色编号varchar(20)PKRoleName角色名称varchar(20)RoleNote角色信息描述varchar(20)2.2.3用户-角色表(Static_User_Role)Static_User_Role Static_User字段名详细解释类型备注UserRoleID用户角色编号varchar(20)PKUserID用户编号varchar(20)FKRoleID角色编号varchar(20)FKUserRoleNote用户角色信息描述varchar(20)2.2.4权限表(Static_Permission)Static_Permission Static_User字段名详细解释类型备注PermissionID编号varchar(20)PKPermissionName权限名称varchar(20)PermissionNote全息信息描述varchar(20)2.2.5角色-权限表(Static_Role_Permission)Static_Role_Permission Static_User字段名详细解释类型备注RolePermissionID角色权限编号varchar(20)PKRoleID角色编号varchar(20)FKPermissionID权限编号varchar(20)FKRolePermissionNote角色权限信息描述varchar(20)用“位”来存储、修改用户权限的方法以前我用记录方式,如A用户有3个模块权限,则A有三条记录看到别人的程序里有这种方法,感觉不错,给大家看看有没有优点可取。
用户权限用一个int字段表示,可以放32位,如果有第1,3,4模块的权限则,值为148=13____________________userId_____userQx___A??????????????|????13_________|___________增加权限具体实现如增加第四个模块的权限,4的二进制值8update qxUser set userQx=userQx|8where userId='A'删除第四个模块的权限update qxUser set userQx=userQx&~8where userId='A'如果删除第四个模块,则不加条件就可以了update qxUser set userQx=userQx&~8以上在SqlServer2000企业版通过。
欢迎大家讨论,有更好的方法大家共享呀~~~在Java里34&2!=0就行了。
通过二,三两步的理解,相信这篇文章就不会生涩了!~首先上文权限设计拙见(1)中只是想记录下自己权限设计上的一点看法,以及将自己日常最常用的权限解决方案记录下来以供日后回顾,没想到有朋友关注此类的设计,那就只能先把代码拿出来献丑了,抛砖引玉,大家共同探讨学习接着上文来说,上文所讨论的权限设计是一条思路,但既然是web应用,少不了数据库的支持,本文我们来讨论一下数据库的设计。
(以下想法及思路仅仅代表本人拙见)说到权限的数据库设计,必先理清权限中几种实体及其关系,此部分想必有过设计权限经验的同仁都知道怎么设计了,网上摆渡一下也是一裤衩子一裤衩子的,我们就在最平凡直观的数据库关系的基础上来建立权限。
下面是我的几个表(所有的表都带有一个pk_id,作为表的自动生成的唯一主键):用户表(T_UserInfo):1/*==============================================================*/2/*Table:T_UserInfo*/3/*==============================================================*/4create table T_UserInfo5(6pk_id NUMBER not null,7name VARCHAR2(20),8sex BOOLEAN,9age int,10emp_num NUMBER,11polity int,12unit VARCHAR2(50),13department VARCHAR2(20),14specialty int,15position VARCHAR2(10),16offtel VARCHAR2(20),17famtel VARCHAR2(20),18post_state VARCHAR2(10),19remark VARCHAR2(100),20constraint PK_T_USERINFO primary key(pk_id)21);实战经验:用户表就不多说了,都是一些常用字段,年龄、电话、职位等,建议大家建立一个通用一些,字段多一些的一个用户表,便于以后扩展,以后如果有特殊需求,不用扩这个基本表,可以通过主外键关系来新建一个表,用于扩充字段角色表(T_RoleInfo):1/*==============================================================*/2/*Table:T_RoleInfo*/3/*==============================================================*/4create table T_RoleInfo5(6pk_id number not null,7role_name VARCHAR2(20),8role_desc VARCHAR2(100),9parent_role_id NUMBER,10constraint PK_T_ROLEINFO primary key(pk_id)11);角色表中需要说明的就一个parent_role_id父角色id,此字段用来扩展角色的继承关系。