基本上涉及到用戶參與的系統都要進行權限管理,權限管理屬於系統安全的範疇,權限管理實現對用戶訪問系統的控制,按照安全規則或則安全策略控制用戶能夠訪問並且只能訪問被受權的資源。java
權限管理包括用戶身份認證和受權兩部分,簡稱認證受權。對於須要訪問控制的資源用戶首先通過身份認證,認證經過以後用戶具備該資源的訪問權限方可訪問sql
主體:帳號,密碼安全
資源:資源名稱、訪問地址框架
權限:權限名稱、資源idui
角色:角色名稱url
角色和權限關係(角色id、權限id)spa
主體和角色關係(主體id,角色id)翻譯
可是一般狀況下,咱們都會把資源和權限表合併成爲一張權限表設計
基於角色的訪問控制是以角色爲中心進行訪問控制,好比:主體的角色爲總經理能夠查詢企業運行報表,查詢員工工資信息等,訪問控制流程以下:3d
上圖翻譯成代碼:
if(主體.hasRole("總經理角色id")){
//查詢員工工資信息
}
缺點:以角色進行訪問控制粒度教粗,若是上圖查詢工資所須要的角色變化爲總經理和部門經理,此時就須要修改判斷邏輯,可擴展性差
修改代碼以下:
if(主體.hasRole("總經理id") || 主體.hasRole("部門經理id")){
//查詢員工工資信息
}
因此不推薦採用此方法進行權限管理
基於資源的訪問控制是以資源爲中心進行訪問控制,好比:主體必須具備查詢工資權限才能查詢員工工資信息。
if(主體.hasPermission("查詢工資權限id")){
//查詢員工工資信息
}
優勢:系統設計時定義好查詢工資的權限標識,即便查詢工資所須要的角色變化爲總經理和部門經理也只須要將「查詢員工工資信息權限」添加到「部門經理角色」的權限列表中,判斷邏輯不用變,系統可擴展性強。
推薦使用此方法進行權限訪問控制。
粗顆粒度控制在頁面,類,方法,按鈕。可使用框架系別贊成進行管理
細顆粒度控制在具體的業務流程,好比001用戶查詢,建立寫在每一個業務邏輯模塊中。好比:對u01用戶分配商品修改權限,u01用戶只能對商品進行修改。
基於url攔截,實現思路是:將系統操做的每一個url配置在權限表中,將權限對應到角色,將角色分配到用戶,用戶訪問系統功能經過filter進行過濾,過濾器獲取到用戶訪問的url,只要訪問的url是用戶分配角色中的url則進行訪問
sql-table:
/*
SQLyog v10.2
MySQL - 5.1.72-community : Database - shiro
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!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 */;
/*Table structure for table `sys_permission` */
CREATE TABLE `sys_permission` (
`id` bigint(20) NOT NULL COMMENT '主鍵',
`name` varchar(128) NOT NULL COMMENT '資源名稱',
`type` varchar(32) NOT NULL COMMENT '資源類型:menu,button,',
`url` varchar(128) DEFAULT NULL COMMENT '訪問url地址',
`percode` varchar(128) DEFAULT NULL COMMENT '權限代碼字符串',
`parentid` bigint(20) DEFAULT NULL COMMENT '父結點id',
`parentids` varchar(128) DEFAULT NULL COMMENT '父結點id列表串',
`sortstring` varchar(128) DEFAULT NULL COMMENT '排序號',
`available` char(1) DEFAULT NULL COMMENT '是否可用,1:可用,0不可用',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Table structure for table `sys_role` */
CREATE TABLE `sys_role` (
`id` varchar(36) NOT NULL,
`name` varchar(128) NOT NULL,
`available` char(1) DEFAULT NULL COMMENT '是否可用,1:可用,0不可用',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Table structure for table `sys_role_permission` */
CREATE TABLE `sys_role_permission` (
`id` varchar(36) NOT NULL,
`sys_role_id` varchar(32) NOT NULL COMMENT '角色id',
`sys_permission_id` varchar(32) NOT NULL COMMENT '權限id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Table structure for table `sys_user` */
CREATE TABLE `sys_user` (
`id` varchar(36) NOT NULL COMMENT '主鍵',
`usercode` varchar(32) NOT NULL COMMENT '帳號',
`username` varchar(64) NOT NULL COMMENT '姓名',
`password` varchar(32) NOT NULL COMMENT '密碼',
`salt` varchar(64) DEFAULT NULL COMMENT '鹽',
`locked` char(1) DEFAULT NULL COMMENT '帳號是否鎖定,1:鎖定,0未鎖定',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Table structure for table `sys_user_role` */
CREATE TABLE `sys_user_role` (
`id` varchar(36) NOT NULL,
`sys_user_id` varchar(32) NOT NULL,
`sys_role_id` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*
SQLyog v10.2
MySQL - 5.1.72-community : Database - shiro
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!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 */;
/*Data for the table `sys_permission` */
insert into `sys_permission`(`id`,`name`,`type`,`url`,`percode`,`parentid`,`parentids`,`sortstring`,`available`) values (1,'權限','','',NULL,0,'0/','0','1'),(11,'商品管理','menu','/item/queryItem.action',NULL,1,'0/1/','1.','1'),(12,'商品新增','permission','/item/add.action','item:create',11,'0/1/11/','','1'),(13,'商品修改','permission','/item/editItem.action','item:update',11,'0/1/11/','','1'),(14,'商品刪除','permission','','item:delete',11,'0/1/11/','','1'),(15,'商品查詢','permission','/item/queryItem.action','item:query',11,'0/1/15/',NULL,'1'),(21,'用戶管理','menu','/user/query.action','user:query',1,'0/1/','2.','1'),(22,'用戶新增','permission','','user:create',21,'0/1/21/','','1'),(23,'用戶修改','permission','','user:update',21,'0/1/21/','','1'),(24,'用戶刪除','permission','','user:delete',21,'0/1/21/','','1');
/*Data for the table `sys_role` */
insert into `sys_role`(`id`,`name`,`available`) values ('ebc8a441-c6f9-11e4-b137-0adc305c3f28','商品管理員','1'),('ebc9d647-c6f9-11e4-b137-0adc305c3f28','用戶管理員','1');
/*Data for the table `sys_role_permission` */
insert into `sys_role_permission`(`id`,`sys_role_id`,`sys_permission_id`) values ('ebc8a441-c6f9-11e4-b137-0adc305c3f21','ebc8a441-c6f9-11e4-b137-0adc305c','12'),('ebc8a441-c6f9-11e4-b137-0adc305c3f22','ebc8a441-c6f9-11e4-b137-0adc305c','11'),('ebc8a441-c6f9-11e4-b137-0adc305c3f24','ebc9d647-c6f9-11e4-b137-0adc305c','21'),('ebc8a441-c6f9-11e4-b137-0adc305c3f25','ebc8a441-c6f9-11e4-b137-0adc305c','15'),('ebc9d647-c6f9-11e4-b137-0adc305c3f23','ebc9d647-c6f9-11e4-b137-0adc305c','22'),('ebc9d647-c6f9-11e4-b137-0adc305c3f26','ebc8a441-c6f9-11e4-b137-0adc305c','13');
/*Data for the table `sys_user` */
insert into `sys_user`(`id`,`usercode`,`username`,`password`,`salt`,`locked`) values ('lisi','lisi','李四','bf07fd8bbc73b6f70b8319f2ebb87483','uiwueylm','0'),('zhangsan','zhangsan','張三','cb571f7bd7a6f73ab004a70322b963d5','eteokues','0');
/*Data for the table `sys_user_role` */
insert into `sys_user_role`(`id`,`sys_user_id`,`sys_role_id`) values ('ebc8a441-c6f9-11e4-b137-0adc305c3f28','zhangsan','ebc8a441-c6f9-11e4-b137-0adc305c'),('ebc9d647-c6f9-11e4-b137-0adc305c3f28','lisi','ebc9d647-c6f9-11e4-b137-0adc305c');
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;