基于角色的访问控制
基于角色的权限系统(RBAC)是一个在很多系统中都取得过成功应用的访问控制系统,它是一种既直观也很灵活的权限管理系统。
一个核心的RBAC系统是以角色(Role)为中心构成的,它的基本结构如图1.0所示。
图 1.0
从图中可以看出,它由用户、角色、权限三个部分组成,其中,权限部分又包含目标对象及对目标对象的操作,如图1.1所示。
图 1.1
有人把实现这个核心的RBAC的系统称为粗粒度的权限管理系统,之所以这样说,是因为它没有解决以下的问题。
在像政府这样有层级的组织结构的系统中,同样的角色,比如局长、上下级局长的权限一同自不必说,即使是同级的局长,也只能有管理他自己所在局的权限。因此,这就要求在用户这一端设置诸如机构、部门等对象,这样做也存在争议,因为这亲做权限系统的粒度是变细了,但是权限与业务逻辑之间的界限开始变得模糊起来了。
上面这段话是罗会波老师在它的著作《JSF第一步:JSF+Spring+Hibernate+Ajax编程实践》里面提到的,整体来说,这段话是对的,不过,我们如果在设计上述系统的时候,只需要用职位将角色细化成小组就可以了。关于角色,我个人的理解是角色就是权限条目的有限集合,或者称为权限组正准确一些。这个时候,如果我们能将角色定义成可以继承的层次结构,那么在后续的使用过程中,就会方便很多。
In Action
CREATE TABLE `tb_authority` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`pid` bigint NOT NULL DEFAULT '0' COMMENT 'parent id',
`name` varchar(16) NOT NULL DEFAULT '' COMMENT 'authority name',
`url` varchar(255) DEFAULT '' COMMENT 'url',
`title` varchar(64) NOT NULL DEFAULT '' COMMENT 'title',
`target` varchar(64) NOT NULL DEFAULT '' COMMENT 'target',
`icon` varchar(64) NOT NULL DEFAULT '' COMMENT 'icon',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='authority';
CREATE TABLE `tb_department` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`pid` bigint NOT NULL DEFAULT '0' COMMENT 'parent id',
`name` varchar(16) NOT NULL DEFAULT '' COMMENT 'department name',
`code` varchar(255) NOT NULL DEFAULT '' COMMENT 'department code',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='department';
CREATE TABLE `tb_role` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`role_name` varchar(16) NOT NULL DEFAULT '' COMMENT 'role name',
`role_code` varchar(255) NOT NULL DEFAULT '' COMMENT 'role code',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='role';
CREATE TABLE `tb_role_authority` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`role_id` bigint NOT NULL DEFAULT '0' COMMENT 'role id',
`authority_id` bigint NOT NULL DEFAULT '0' COMMENT 'authority id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='role authority';
CREATE TABLE `tb_user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`user_name` varchar(16) NOT NULL DEFAULT '' COMMENT 'user name',
`password` varchar(255) NOT NULL DEFAULT '' COMMENT 'password',
`department_id` bigint NOT NULL DEFAULT '0' COMMENT 'department id',
`email` varchar(255) DEFAULT NULL COMMENT 'email',
`telephone` varchar(10) NOT NULL DEFAULT '' COMMENT 'telephone',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户';
CREATE TABLE `tb_user_role` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`user_id` bigint NOT NULL DEFAULT '0' COMMENT 'user id',
`role_id` bigint NOT NULL DEFAULT '0' COMMENT 'role id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='user role';
参考文献
- 《JSF第一步:JSF+Spring+Hibernate+Ajax编程实践》(罗会波著;北京:清华大学出版社,2007.10;ISBN 978-7-302-15973-5)