我们的后台系统需要通过权限管理,来让不同的管理员有不同的权限
比如课程管理用户,只能操作课程,讲师管理用户,只能操作讲师
实现起来非常简单,我们后台的路由都是固定的,现在将其变成根据不同用户动态显示不同路由即可
1、数据库
菜单表和角色表和用户表,菜单表与角色表是多对多,角色表和用户表是多对多
如果是一对多(我们以前的表大多都是一对多),只需要外键就可以了
但多对多,需要额外的一张表来表示关系,所以一共5张表
CREATE TABLE ` acl_permission` (
` id` char ( 19 ) NOT NULL DEFAULT '' COMMENT '编号' ,
` pid` char ( 19 ) NOT NULL DEFAULT '' COMMENT '所属上级' ,
` name` varchar ( 20 ) NOT NULL DEFAULT '' COMMENT '名称' ,
` type ` tinyint ( 3 ) NOT NULL DEFAULT '0' COMMENT '类型(1:菜单,2:按钮)' ,
` permission_value` varchar ( 50 ) DEFAULT NULL COMMENT '权限值' ,
` path` varchar ( 100 ) DEFAULT NULL COMMENT '访问路径' ,
` component` varchar ( 100 ) DEFAULT NULL COMMENT '组件路径' ,
` icon` varchar ( 50 ) DEFAULT NULL COMMENT '图标' ,
` status ` tinyint ( 4 ) DEFAULT NULL COMMENT '状态(0:禁止,1:正常)' ,
` is_deleted` tinyint ( 1 ) unsigned NOT NULL DEFAULT '0' COMMENT '逻辑删除 1(true)已删除, 0(false)未删除' ,
` gmt_create` datetime DEFAULT NULL COMMENT '创建时间' ,
` gmt_modified` datetime DEFAULT NULL COMMENT '更新时间' ,
PRIMARY KEY ( ` id` ) ,
KEY ` idx_pid` ( ` pid` )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '权限' ;
INSERT INTO ` acl_permission` VALUES ( '1' , '0' , '全部数据' , 0 , NULL , NULL , NULL , NULL , NULL , 0 , '2019-11-15 17:13:06' , '2019-11-15 17:13:06' ) , ( '1195268474480156673' , '1' , '权限管理' , 1 , NULL , '/acl' , 'Layout' , NULL , NULL , 0 , '2019-11-15 17:13:06' , '2019-11-18 13:54:25' ) , ( '1195268616021139457' , '1195268474480156673' , '用户管理' , 1 , NULL , 'user/list' , '/acl/user/list' , NULL , NULL , 0 , '2019-11-15 17:13:40' , '2019-11-18 13:53:12' ) , ( '1195268788138598401' , '1195268474480156673' , '角色管理' , 1 , NULL , 'role/list' , '/acl/role/list' , NULL , NULL , 0 , '2019-11-15 17:14:21' , '2019-11-15 17:14:21' ) , ( '1195268893830864898' , '1195268474480156673' , '菜单管理' , 1 , NULL , 'menu/list' , '/acl/menu/list' , NULL , NULL , 0 , '2019-11-15 17:14:46' , '2019-11-15 17:14:46' ) , ( '1195269143060602882' , '1195268616021139457' , '查看' , 2 , 'user.list' , '' , '' , NULL , NULL , 0 , '2019-11-15 17:15:45' , '2019-11-17 21:57:16' ) , ( '1195269295926206466' , '1195268616021139457' , '添加' , 2 , 'user.add' , 'user/add' , '/acl/user/form' , NULL , NULL , 0 , '2019-11-15 17:16:22' , '2019-11-15 17:16:22' ) , ( '1195269473479483394' , '1195268616021139457' , '修改' , 2 , 'user.update' , 'user/update/:id' , '/acl/user/form' , NULL , NULL , 0 , '2019-11-15 17:17:04' , '2019-11-15 17:17:04' ) , ( '1195269547269873666' , '1195268616021139457' , '删除' , 2 , 'user.remove' , '' , '' , NULL , NULL , 0 , '2019-11-15 17:17:22' , '2019-11-15 17:17:22' ) , ( '1195269821262782465' , '1195268788138598401' , '修改' , 2 , 'role.update' , 'role/update/:id' , '/acl/role/form' , NULL , NULL , 0 , '2019-11-15 17:18:27' , '2019-11-15 17:19:53' ) , ( '1195269903542444034' , '1195268788138598401' , '查看' , 2 , 'role.list' , '' , '' , NULL , NULL , 0 , '2019-11-15 17:18:47' , '2019-11-15 17:18:47' ) , ( '1195270037005197313' , '1195268788138598401' , '添加' , 2 , 'role.add' , 'role/add' , '/acl/role/form' , NULL , NULL , 0 , '2019-11-15 17:19:19' , '2019-11-18 11:05:42' ) , ( '1195270442602782721' , '1195268788138598401' , '删除' , 2 , 'role.remove' , '' , '' , NULL , NULL , 0 , '2019-11-15 17:20:55' , '2019-11-15 17:20:55' ) , ( '1195270621548568578' , '1195268788138598401' , '角色权限' , 2 , 'role.acl' , 'role/distribution/:id' , '/acl/role/roleForm' , NULL , NULL , 0 , '2019-11-15 17:21:38' , '2019-11-15 17:21:38' ) , ( '1195270744097742849' , '1195268893830864898' , '查看' , 2 , 'permission.list' , '' , '' , NULL , NULL , 0 , '2019-11-15 17:22:07' , '2019-11-15 17:22:07' ) , ( '1195270810560684034' , '1195268893830864898' , '添加' , 2 , 'permission.add' , '' , '' , NULL , NULL , 0 , '2019-11-15 17:22:23' , '2019-11-15 17:22:23' ) , ( '1195270862100291586' , '1195268893830864898' , '修改' , 2 , 'permission.update' , '' , '' , NULL , NULL , 0 , '2019-11-15 17:22:35' , '2019-11-15 17:22:35' ) , ( '1195270887933009922' , '1195268893830864898' , '删除' , 2 , 'permission.remove' , '' , '' , NULL , NULL , 0 , '2019-11-15 17:22:41' , '2019-11-15 17:22:41' ) , ( '1195349439240048642' , '1' , '讲师管理' , 1 , NULL , '/edu/teacher' , 'Layout' , NULL , NULL , 0 , '2019-11-15 22:34:49' , '2019-11-15 22:34:49' ) , ( '1195349699995734017' , '1195349439240048642' , '讲师列表' , 1 , NULL , 'list' , '/edu/teacher/list' , NULL , NULL , 0 , '2019-11-15 22:35:52' , '2019-11-15 22:35:52' ) , ( '1195349810561781761' , '1195349439240048642' , '添加讲师' , 1 , NULL , 'create' , '/edu/teacher/form' , NULL , NULL , 0 , '2019-11-15 22:36:18' , '2019-11-15 22:36:18' ) , ( '1195349876252971010' , '1195349810561781761' , '添加' , 2 , 'teacher.add' , '' , '' , NULL , NULL , 0 , '2019-11-15 22:36:34' , '2019-11-15 22:36:34' ) , ( '1195349979797753857' , '1195349699995734017' , '查看' , 2 , 'teacher.list' , '' , '' , NULL , NULL , 0 , '2019-11-15 22:36:58' , '2019-11-15 22:36:58' ) , ( '1195350117270261762' , '1195349699995734017' , '修改' , 2 , 'teacher.update' , 'edit/:id' , '/edu/teacher/form' , NULL , NULL , 0 , '2019-11-15 22:37:31' , '2019-11-15 22:37:31' ) , ( '1195350188359520258' , '1195349699995734017' , '删除' , 2 , 'teacher.remove' , '' , '' , NULL , NULL , 0 , '2019-11-15 22:37:48' , '2019-11-15 22:37:48' ) , ( '1195350299365969922' , '1' , '课程分类' , 1 , NULL , '/edu/subject' , 'Layout' , NULL , NULL , 0 , '2019-11-15 22:38:15' , '2019-11-15 22:38:15' ) , ( '1195350397751758850' , '1195350299365969922' , '课程分类列表' , 1 , NULL , 'list' , '/edu/subject/list' , NULL , NULL , 0 , '2019-11-15 22:38:38' , '2019-11-15 22:38:38' ) , ( '1195350500512206850' , '1195350299365969922' , '导入课程分类' , 1 , NULL , 'import' , '/edu/subject/import' , NULL , NULL , 0 , '2019-11-15 22:39:03' , '2019-11-15 22:39:03' ) , ( '1195350612172967938' , '1195350397751758850' , '查看' , 2 , 'subject.list' , '' , '' , NULL , NULL , 0 , '2019-11-15 22:39:29' , '2019-11-15 22:39:29' ) , ( '1195350687590748161' , '1195350500512206850' , '导入' , 2 , 'subject.import' , '' , '' , NULL , NULL , 0 , '2019-11-15 22:39:47' , '2019-11-15 22:39:47' ) , ( '1195350831744782337' , '1' , '课程管理' , 1 , NULL , '/edu/course' , 'Layout' , NULL , NULL , 0 , '2019-11-15 22:40:21' , '2019-11-15 22:40:21' ) , ( '1195350919074385921' , '1195350831744782337' , '课程列表' , 1 , NULL , 'list' , '/edu/course/list' , NULL , NULL , 0 , '2019-11-15 22:40:42' , '2019-11-15 22:40:42' ) , ( '1195351020463296513' , '1195350831744782337' , '发布课程' , 1 , NULL , 'info' , '/edu/course/info' , NULL , NULL , 0 , '2019-11-15 22:41:06' , '2019-11-15 22:41:06' ) , ( '1195351159672246274' , '1195350919074385921' , '完成发布' , 2 , 'course.publish' , 'publish/:id' , '/edu/course/publish' , NULL , NULL , 0 , '2019-11-15 22:41:40' , '2019-11-15 22:44:01' ) , ( '1195351326706208770' , '1195350919074385921' , '编辑课程' , 2 , 'course.update' , 'info/:id' , '/edu/course/info' , NULL , NULL , 0 , '2019-11-15 22:42:19' , '2019-11-15 22:42:19' ) , ( '1195351566221938690' , '1195350919074385921' , '编辑课程大纲' , 2 , 'chapter.update' , 'chapter/:id' , '/edu/course/chapter' , NULL , NULL , 0 , '2019-11-15 22:43:17' , '2019-11-15 22:43:17' ) , ( '1195351862889254913' , '1' , '统计分析' , 1 , NULL , '/statistics/daily' , 'Layout' , NULL , NULL , 0 , '2019-11-15 22:44:27' , '2019-11-15 22:44:27' ) , ( '1195351968841568257' , '1195351862889254913' , '生成统计' , 1 , NULL , 'create' , '/statistics/daily/create' , NULL , NULL , 0 , '2019-11-15 22:44:53' , '2019-11-15 22:44:53' ) , ( '1195352054917074946' , '1195351862889254913' , '统计图表' , 1 , NULL , 'chart' , '/statistics/daily/chart' , NULL , NULL , 0 , '2019-11-15 22:45:13' , '2019-11-15 22:45:13' ) , ( '1195352127734386690' , '1195352054917074946' , '查看' , 2 , 'daily.list' , '' , '' , NULL , NULL , 0 , '2019-11-15 22:45:30' , '2019-11-15 22:45:30' ) , ( '1195352215768633346' , '1195351968841568257' , '生成' , 2 , 'daily.add' , '' , '' , NULL , NULL , 0 , '2019-11-15 22:45:51' , '2019-11-15 22:45:51' ) , ( '1195352547621965825' , '1' , 'CMS管理' , 1 , NULL , '/cms' , 'Layout' , NULL , NULL , 0 , '2019-11-15 22:47:11' , '2019-11-18 10:51:46' ) , ( '1195352856645701633' , '1195353513549205505' , '查看' , 2 , 'banner.list' , '' , NULL , NULL , NULL , 0 , '2019-11-15 22:48:24' , '2019-11-15 22:48:24' ) , ( '1195352909401657346' , '1195353513549205505' , '添加' , 2 , 'banner.add' , 'banner/add' , '/cms/banner/form' , NULL , NULL , 0 , '2019-11-15 22:48:37' , '2019-11-18 10:52:10' ) , ( '1195353051395624961' , '1195353513549205505' , '修改' , 2 , 'banner.update' , 'banner/update/:id' , '/cms/banner/form' , NULL , NULL , 0 , '2019-11-15 22:49:11' , '2019-11-18 10:52:05' ) , ( '1195353513549205505' , '1195352547621965825' , 'Bander列表' , 1 , NULL , 'banner/list' , '/cms/banner/list' , NULL , NULL , 0 , '2019-11-15 22:51:01' , '2019-11-18 10:51:29' ) , ( '1195353672110673921' , '1195353513549205505' , '删除' , 2 , 'banner.remove' , '' , '' , NULL , NULL , 0 , '2019-11-15 22:51:39' , '2019-11-15 22:51:39' ) , ( '1195354076890370050' , '1' , '订单管理' , 1 , NULL , '/order' , 'Layout' , NULL , NULL , 0 , '2019-11-15 22:53:15' , '2019-11-15 22:53:15' ) , ( '1195354153482555393' , '1195354076890370050' , '订单列表' , 1 , NULL , 'list' , '/order/list' , NULL , NULL , 0 , '2019-11-15 22:53:33' , '2019-11-15 22:53:58' ) , ( '1195354315093282817' , '1195354153482555393' , '查看' , 2 , 'order.list' , '' , '' , NULL , NULL , 0 , '2019-11-15 22:54:12' , '2019-11-15 22:54:12' ) , ( '1196301740985311234' , '1195268616021139457' , '分配角色' , 2 , 'user.assgin' , 'user/role/:id' , '/acl/user/roleForm' , NULL , NULL , 0 , '2019-11-18 13:38:56' , '2019-11-18 13:38:56' ) ;
CREATE TABLE ` acl_role` (
` id` char ( 19 ) NOT NULL DEFAULT '' COMMENT '角色id' ,
` role_name` varchar ( 20 ) NOT NULL DEFAULT '' COMMENT '角色名称' ,
` role_code` varchar ( 20 ) DEFAULT NULL COMMENT '角色编码' ,
` remark` varchar ( 255 ) DEFAULT NULL COMMENT '备注' ,
` is_deleted` tinyint ( 1 ) unsigned NOT NULL DEFAULT '0' COMMENT '逻辑删除 1(true)已删除, 0(false)未删除' ,
` gmt_create` datetime NOT NULL COMMENT '创建时间' ,
` gmt_modified` datetime NOT NULL COMMENT '更新时间' ,
PRIMARY KEY ( ` id` )
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO ` acl_role` VALUES ( '1' , '普通管理员' , NULL , NULL , 0 , '2019-11-11 13:09:32' , '2019-11-18 10:27:18' ) , ( '1193757683205607426' , '课程管理员' , NULL , NULL , 0 , '2019-11-11 13:09:45' , '2019-11-18 10:25:44' ) , ( '1196300996034977794' , 'test' , NULL , NULL , 0 , '2019-11-18 13:35:58' , '2019-11-18 13:35:58' ) ;
CREATE TABLE ` acl_role_permission` (
` id` char ( 19 ) NOT NULL DEFAULT '' ,
` role_id` char ( 19 ) NOT NULL DEFAULT '' ,
` permission_id` char ( 19 ) NOT NULL DEFAULT '' ,
` is_deleted` tinyint ( 1 ) unsigned NOT NULL DEFAULT '0' COMMENT '逻辑删除 1(true)已删除, 0(false)未删除' ,
` gmt_create` datetime NOT NULL COMMENT '创建时间' ,
` gmt_modified` datetime NOT NULL COMMENT '更新时间' ,
PRIMARY KEY ( ` id` ) ,
KEY ` idx_role_id` ( ` role_id` ) ,
KEY ` idx_permission_id` ( ` permission_id` )
) ENGINE = InnoDB DEFAULT CHARSET = utf8 COMMENT = '角色权限' ;
INSERT INTO ` acl_role_permission` VALUES ( '1196301979754455041' , '1' , '1' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301979792203778' , '1' , '1195268474480156673' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301979821563906' , '1' , '1195268616021139457' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301979842535426' , '1' , '1195269143060602882' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301979855118338' , '1' , '1195269295926206466' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301979880284161' , '1' , '1195269473479483394' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301979913838593' , '1' , '1195269547269873666' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301979926421506' , '1' , '1196301740985311234' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301979951587330' , '1' , '1195268788138598401' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980014501889' , '1' , '1195269821262782465' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980035473410' , '1' , '1195269903542444034' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980052250626' , '1' , '1195270037005197313' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980077416450' , '1' , '1195270442602782721' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980094193665' , '1' , '1195270621548568578' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980119359489' , '1' , '1195268893830864898' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980136136706' , '1' , '1195270744097742849' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980249382913' , '1' , '1195270810560684034' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980270354434' , '1' , '1195270862100291586' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980287131649' , '1' , '1195270887933009922' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980303908866' , '1' , '1195349439240048642' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980320686082' , '1' , '1195349699995734017' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980345851905' , '1' , '1195349979797753857' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980362629121' , '1' , '1195350117270261762' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980383600641' , '1' , '1195350188359520258' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980408766465' , '1' , '1195349810561781761' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980421349378' , '1' , '1195349876252971010' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980438126593' , '1' , '1195350299365969922' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980450709506' , '1' , '1195350397751758850' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980501041153' , '1' , '1195350612172967938' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980517818370' , '1' , '1195350500512206850' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980538789889' , '1' , '1195350687590748161' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980622675970' , '1' , '1195350831744782337' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980639453186' , '1' , '1195350919074385921' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980660424705' , '1' , '1195351159672246274' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980677201922' , '1' , '1195351326706208770' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980698173441' , '1' , '1195351566221938690' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980714950658' , '1' , '1195351020463296513' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980723339266' , '1' , '1195351862889254913' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980744310786' , '1' , '1195351968841568257' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980761088001' , '1' , '1195352215768633346' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980777865217' , '1' , '1195352054917074946' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980794642434' , '1' , '1195352127734386690' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980811419650' , '1' , '1195352547621965825' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980828196865' , '1' , '1195353513549205505' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980844974082' , '1' , '1195352856645701633' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980861751298' , '1' , '1195352909401657346' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980886917122' , '1' , '1195353051395624961' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980928860162' , '1' , '1195353672110673921' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980954025986' , '1' , '1195354076890370050' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980970803201' , '1' , '1195354153482555393' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196301980987580418' , '1' , '1195354315093282817' , 1 , '2019-11-18 13:39:53' , '2019-11-18 13:39:53' ) , ( '1196305293070077953' , '1' , '1' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293099438081' , '1' , '1195268474480156673' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293120409602' , '1' , '1195268616021139457' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293153964034' , '1' , '1195269143060602882' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293183324162' , '1' , '1195269295926206466' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293212684290' , '1' , '1195269473479483394' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293237850114' , '1' , '1195269547269873666' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293271404545' , '1' , '1196301740985311234' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293485314049' , '1' , '1195268788138598401' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293506285569' , '1' , '1195269821262782465' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293527257089' , '1' , '1195269903542444034' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293552422914' , '1' , '1195270037005197313' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293565005825' , '1' , '1195270442602782721' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293594365954' , '1' , '1195270621548568578' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293611143169' , '1' , '1195268893830864898' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293627920385' , '1' , '1195270744097742849' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293657280513' , '1' , '1195349439240048642' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293674057729' , '1' , '1195349699995734017' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293690834946' , '1' , '1195349979797753857' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293716000770' , '1' , '1195350117270261762' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) , ( '1196305293736972290' , '1' , '1195350188359520258' , 1 , '2019-11-18 13:53:03' , '2019-11-18 13:53:03' ) ;
CREATE TABLE ` acl_user` (
` id` char ( 19 ) NOT NULL COMMENT '会员id' ,
` username` varchar ( 20 ) NOT NULL DEFAULT '' COMMENT '微信openid' ,
` password` varchar ( 32 ) NOT NULL DEFAULT '' COMMENT '密码' ,
` nick_name` varchar ( 50 ) DEFAULT NULL COMMENT '昵称' ,
` salt` varchar ( 255 ) DEFAULT NULL COMMENT '用户头像' ,
` token` varchar ( 100 ) DEFAULT NULL COMMENT '用户签名' ,
` is_deleted` tinyint ( 1 ) unsigned NOT NULL DEFAULT '0' COMMENT '逻辑删除 1(true)已删除, 0(false)未删除' ,
` gmt_create` datetime NOT NULL COMMENT '创建时间' ,
` gmt_modified` datetime NOT NULL COMMENT '更新时间' ,
PRIMARY KEY ( ` id` ) ,
UNIQUE KEY ` uk_username` ( ` username` )
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '用户表' ;
INSERT INTO ` acl_user` VALUES ( '1' , 'admin' , '96e79218965eb72c92a549dd5a330112' , 'admin' , '' , NULL , 0 , '2019-11-01 10:39:47' , '2019-11-01 10:39:47' ) , ( '2' , 'test' , '96e79218965eb72c92a549dd5a330112' , 'test' , NULL , NULL , 0 , '2019-11-01 16:36:07' , '2019-11-01 16:40:08' ) ;
CREATE TABLE ` acl_user_role` (
` id` char ( 19 ) NOT NULL DEFAULT '' COMMENT '主键id' ,
` role_id` char ( 19 ) NOT NULL DEFAULT '0' COMMENT '角色id' ,
` user_id` char ( 19 ) NOT NULL DEFAULT '0' COMMENT '用户id' ,
` is_deleted` tinyint ( 1 ) unsigned NOT NULL DEFAULT '0' COMMENT '逻辑删除 1(true)已删除, 0(false)未删除' ,
` gmt_create` datetime NOT NULL COMMENT '创建时间' ,
` gmt_modified` datetime NOT NULL COMMENT '更新时间' ,
PRIMARY KEY ( ` id` ) ,
KEY ` idx_role_id` ( ` role_id` ) ,
KEY ` idx_user_id` ( ` user_id` )
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
INSERT INTO ` acl_user_role` VALUES ( '1' , '1' , '2' , 0 , '2019-11-11 13:09:53' , '2019-11-11 13:09:53' ) ;
2、创建公有子模块spring-security(先创建,之后再讲,我们权限管理需要它)
1、创建子模块,引入依赖
< ! -- spring boot web-- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- web< / artifactId>
< version> 2.2 .6 . RELEASE< / version>
< / dependency>
< dependency>
< groupId> com. yzpnb< / groupId>
< artifactId> common_utils< / artifactId>
< version> 1.0 - SNAPSHOT< / version>
< / dependency>
< ! -- Spring Security依赖 -- >
< dependency>
< groupId> org. springframework. boot< / groupId>
< artifactId> spring- boot- starter- security< / artifactId>
< version> 2.3 .0 . RELEASE< / version>
< / dependency>
< ! -- jjwt-- >
< dependency>
< groupId> io. jsonwebtoken< / groupId>
< artifactId> jjwt< / artifactId>
< version> 0.9 .1 < / version>
< / dependency>
2、工具类
package com. yzpnb. serurity. utils;
import com. fasterxml. jackson. databind. ObjectMapper;
import com. yzpnb. common_utils. Result;
import org. springframework. http. HttpStatus;
import org. springframework. http. MediaType;
import javax. servlet. http. HttpServletResponse;
import java. io. IOException;
public class ResponseUtil {
public static void out ( HttpServletResponse response, Result r) {
ObjectMapper mapper = new ObjectMapper ( ) ;
response. setStatus ( HttpStatus. OK. value ( ) ) ;
response. setContentType ( MediaType. APPLICATION_JSON_UTF8_VALUE) ;
try {
mapper. writeValue ( response. getWriter ( ) , r) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
}
3、Security配置类
package com. yzpnb. serurity. config;
import com. yzpnb. serurity. filter. TokenAuthenticationFilter;
import com. yzpnb. serurity. filter. TokenLoginFilter;
import com. yzpnb. serurity. security. DefaultPasswordEncoder;
import com. yzpnb. serurity. security. TokenLogoutHandler;
import com. yzpnb. serurity. security. TokenManager;
import com. yzpnb. serurity. security. UnauthorizedEntryPoint;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. context. annotation. Configuration;
import org. springframework. data. redis. core. RedisTemplate;
import org. springframework. security. config. annotation. authentication. builders. AuthenticationManagerBuilder;
import org. springframework. security. config. annotation. method. configuration. EnableGlobalMethodSecurity;
import org. springframework. security. config. annotation. web. builders. HttpSecurity;
import org. springframework. security. config. annotation. web. builders. WebSecurity;
import org. springframework. security. config. annotation. web. configuration. EnableWebSecurity;
import org. springframework. security. config. annotation. web. configuration. WebSecurityConfigurerAdapter;
import org. springframework. security. core. userdetails. UserDetailsService;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity ( prePostEnabled = true )
public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter {
private UserDetailsService userDetailsService;
private TokenManager tokenManager;
private DefaultPasswordEncoder defaultPasswordEncoder;
private RedisTemplate redisTemplate;
@Autowired
public TokenWebSecurityConfig ( UserDetailsService userDetailsService, DefaultPasswordEncoder defaultPasswordEncoder,
TokenManager tokenManager, RedisTemplate redisTemplate) {
this . userDetailsService = userDetailsService;
this . defaultPasswordEncoder = defaultPasswordEncoder;
this . tokenManager = tokenManager;
this . redisTemplate = redisTemplate;
}
@Override
protected void configure ( HttpSecurity http) throws Exception {
http. exceptionHandling ( )
. authenticationEntryPoint ( new UnauthorizedEntryPoint ( ) )
. and ( ) . csrf ( ) . disable ( )
. authorizeRequests ( )
. anyRequest ( ) . authenticated ( )
. and ( ) . logout ( ) . logoutUrl ( "/admin/acl/index/logout" )
. addLogoutHandler ( new TokenLogoutHandler ( tokenManager, redisTemplate) ) . and ( )
. addFilter ( new TokenLoginFilter ( authenticationManager ( ) , tokenManager, redisTemplate) )
. addFilter ( new TokenAuthenticationFilter ( authenticationManager ( ) , tokenManager, redisTemplate) ) . httpBasic ( ) ;
}
@Override
public void configure ( AuthenticationManagerBuilder auth) throws Exception {
auth. userDetailsService ( userDetailsService) . passwordEncoder ( defaultPasswordEncoder) ;
}
@Override
public void configure ( WebSecurity web) throws Exception {
web. ignoring ( ) . antMatchers ( "/*/**"
) ;
}
}
4、用户和认证实体类
1、安全认证用户详细信息
package com. yzpnb. serurity. entity;
import lombok. Data;
import lombok. extern. slf4j. Slf4j;
import org. springframework. security. core. GrantedAuthority;
import org. springframework. security. core. authority. SimpleGrantedAuthority;
import org. springframework. security. core. userdetails. UserDetails;
import org. springframework. util. StringUtils;
import java. util. ArrayList;
import java. util. Collection;
import java. util. List;
@Data
@Slf4j
public class SecurityUser implements UserDetails {
private transient User currentUserInfo;
private List< String> permissionValueList;
public SecurityUser ( ) {
}
public SecurityUser ( User user) {
if ( user != null) {
this . currentUserInfo = user;
}
}
@Override
public Collection< ? extends GrantedAuthority > getAuthorities ( ) {
Collection< GrantedAuthority> authorities = new ArrayList < > ( ) ;
for ( String permissionValue : permissionValueList) {
if ( StringUtils. isEmpty ( permissionValue) ) continue ;
SimpleGrantedAuthority authority = new SimpleGrantedAuthority ( permissionValue) ;
authorities. add ( authority) ;
}
return authorities;
}
@Override
public String getPassword ( ) {
return currentUserInfo. getPassword ( ) ;
}
@Override
public String getUsername ( ) {
return currentUserInfo. getUsername ( ) ;
}
@Override
public boolean isAccountNonExpired ( ) {
return true ;
}
@Override
public boolean isAccountNonLocked ( ) {
return true ;
}
@Override
public boolean isCredentialsNonExpired ( ) {
return true ;
}
@Override
public boolean isEnabled ( ) {
return true ;
}
}
2、用户实体类
package com. yzpnb. serurity. entity;
import io. swagger. annotations. ApiModel;
import io. swagger. annotations. ApiModelProperty;
import lombok. Data;
import java. io. Serializable;
@Data
@ApiModel ( description = "用户实体类" )
public class User implements Serializable {
private static final long serialVersionUID = 1 L;
@ApiModelProperty ( value = "微信openid" )
private String username;
@ApiModelProperty ( value = "密码" )
private String password;
@ApiModelProperty ( value = "昵称" )
private String nickName;
@ApiModelProperty ( value = "用户头像" )
private String salt;
@ApiModelProperty ( value = "用户签名" )
private String token;
}
5、过滤器
1、访问过滤器
package com. yzpnb. serurity. filter;
import com. yzpnb. common_utils. Result;
import com. yzpnb. serurity. security. TokenManager;
import com. yzpnb. serurity. utils. ResponseUtil;
import org. springframework. data. redis. core. RedisTemplate;
import org. springframework. security. authentication. AuthenticationManager;
import org. springframework. security. authentication. UsernamePasswordAuthenticationToken;
import org. springframework. security. core. GrantedAuthority;
import org. springframework. security. core. authority. SimpleGrantedAuthority;
import org. springframework. security. core. context. SecurityContextHolder;
import org. springframework. security. web. authentication. www. BasicAuthenticationFilter;
import org. springframework. util. StringUtils;
import javax. servlet. FilterChain;
import javax. servlet. ServletException;
import javax. servlet. http. HttpServletRequest;
import javax. servlet. http. HttpServletResponse;
import java. io. IOException;
import java. util. ArrayList;
import java. util. Collection;
import java. util. List;
public class TokenAuthenticationFilter extends BasicAuthenticationFilter {
private TokenManager tokenManager;
private RedisTemplate redisTemplate;
public TokenAuthenticationFilter ( AuthenticationManager authManager, TokenManager tokenManager, RedisTemplate redisTemplate) {
super ( authManager) ;
this . tokenManager = tokenManager;
this . redisTemplate = redisTemplate;
}
@Override
protected void doFilterInternal ( HttpServletRequest req, HttpServletResponse res, FilterChain chain)
throws IOException, ServletException {
logger. info ( "=================" + req. getRequestURI ( ) ) ;
if ( req. getRequestURI ( ) . indexOf ( "admin" ) == - 1 ) {
chain. doFilter ( req, res) ;
return ;
}
UsernamePasswordAuthenticationToken authentication = null;
try {
authentication = getAuthentication ( req) ;
} catch ( Exception e) {
ResponseUtil. out ( res, Result. error ( ) ) ;
}
if ( authentication != null) {
SecurityContextHolder. getContext ( ) . setAuthentication ( authentication) ;
} else {
ResponseUtil. out ( res, Result. error ( ) ) ;
}
chain. doFilter ( req, res) ;
}
private UsernamePasswordAuthenticationToken getAuthentication ( HttpServletRequest request) {
String token = request. getHeader ( "token" ) ;
if ( token != null && ! "" . equals ( token. trim ( ) ) ) {
String userName = tokenManager. getUserFromToken ( token) ;
List< String> permissionValueList = ( List< String> ) redisTemplate. opsForValue ( ) . get ( userName) ;
Collection< GrantedAuthority> authorities = new ArrayList < > ( ) ;
for ( String permissionValue : permissionValueList) {
if ( StringUtils. isEmpty ( permissionValue) ) continue ;
SimpleGrantedAuthority authority = new SimpleGrantedAuthority ( permissionValue) ;
authorities. add ( authority) ;
}
if ( ! StringUtils. isEmpty ( userName) ) {
return new UsernamePasswordAuthenticationToken ( userName, token, authorities) ;
}
return null;
}
return null;
}
}
2、登陆过滤器
package com. yzpnb. serurity. filter;
import com. fasterxml. jackson. databind. ObjectMapper;
import com. yzpnb. common_utils. Result;
import com. yzpnb. serurity. entity. SecurityUser;
import com. yzpnb. serurity. entity. User;
import com. yzpnb. serurity. security. TokenManager;
import com. yzpnb. serurity. utils. ResponseUtil;
import org. springframework. data. redis. core. RedisTemplate;
import org. springframework. security. authentication. AuthenticationManager;
import org. springframework. security. authentication. UsernamePasswordAuthenticationToken;
import org. springframework. security. core. Authentication;
import org. springframework. security. core. AuthenticationException;
import org. springframework. security. web. authentication. UsernamePasswordAuthenticationFilter;
import org. springframework. security. web. util. matcher. AntPathRequestMatcher;
import javax. servlet. FilterChain;
import javax. servlet. ServletException;
import javax. servlet. http. HttpServletRequest;
import javax. servlet. http. HttpServletResponse;
import java. io. IOException;
import java. util. ArrayList;
public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter {
private AuthenticationManager authenticationManager;
private TokenManager tokenManager;
private RedisTemplate redisTemplate;
public TokenLoginFilter ( AuthenticationManager authenticationManager, TokenManager tokenManager, RedisTemplate redisTemplate) {
this . authenticationManager = authenticationManager;
this . tokenManager = tokenManager;
this . redisTemplate = redisTemplate;
this . setPostOnly ( false ) ;
this . setRequiresAuthenticationRequestMatcher ( new AntPathRequestMatcher ( "/admin/acl/login" , "POST" ) ) ;
}
@Override
public Authentication attemptAuthentication ( HttpServletRequest req, HttpServletResponse res)
throws AuthenticationException {
try {
User user = new ObjectMapper ( ) . readValue ( req. getInputStream ( ) , User. class ) ;
return authenticationManager. authenticate ( new UsernamePasswordAuthenticationToken ( user. getUsername ( ) , user. getPassword ( ) , new ArrayList < > ( ) ) ) ;
} catch ( IOException e) {
throw new RuntimeException ( e) ;
}
}
@Override
protected void successfulAuthentication ( HttpServletRequest req, HttpServletResponse res, FilterChain chain,
Authentication auth) throws IOException, ServletException {
SecurityUser user = ( SecurityUser) auth. getPrincipal ( ) ;
String token = tokenManager. createToken ( user. getCurrentUserInfo ( ) . getUsername ( ) ) ;
redisTemplate. opsForValue ( ) . set ( user. getCurrentUserInfo ( ) . getUsername ( ) , user. getPermissionValueList ( ) ) ;
ResponseUtil. out ( res, Result. ok ( ) . data ( "token" , token) ) ;
}
@Override
protected void unsuccessfulAuthentication ( HttpServletRequest request, HttpServletResponse response,
AuthenticationException e) throws IOException, ServletException {
ResponseUtil. out ( response, Result. error ( ) ) ;
}
}
6、一些业务逻辑类
1、密码的处理方法类型
package com. yzpnb. serurity. security;
import com. yzpnb. common_utils. MD5;
import org. springframework. security. crypto. password. PasswordEncoder;
import org. springframework. stereotype. Component;
@Component
public class DefaultPasswordEncoder implements PasswordEncoder {
public DefaultPasswordEncoder ( ) {
this ( - 1 ) ;
}
public DefaultPasswordEncoder ( int strength) {
}
public String encode ( CharSequence rawPassword) {
return MD5. encrypt ( rawPassword. toString ( ) ) ;
}
public boolean matches ( CharSequence rawPassword, String encodedPassword) {
return encodedPassword. equals ( MD5. encrypt ( rawPassword. toString ( ) ) ) ;
}
}
2、登出业务逻辑类
package com. yzpnb. serurity. security;
import com. yzpnb. common_utils. Result;
import com. yzpnb. serurity. utils. ResponseUtil;
import org. springframework. data. redis. core. RedisTemplate;
import org. springframework. security. core. Authentication;
import org. springframework. security. web. authentication. logout. LogoutHandler;
import javax. servlet. http. HttpServletRequest;
import javax. servlet. http. HttpServletResponse;
public class TokenLogoutHandler implements LogoutHandler {
private TokenManager tokenManager;
private RedisTemplate redisTemplate;
public TokenLogoutHandler ( TokenManager tokenManager, RedisTemplate redisTemplate) {
this . tokenManager = tokenManager;
this . redisTemplate = redisTemplate;
}
@Override
public void logout ( HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
String token = request. getHeader ( "token" ) ;
if ( token != null) {
tokenManager. removeToken ( token) ;
String userName = tokenManager. getUserFromToken ( token) ;
redisTemplate. delete ( userName) ;
}
ResponseUtil. out ( response, Result. ok ( ) ) ;
}
}
3、token管理
package com. yzpnb. serurity. security;
import io. jsonwebtoken. CompressionCodecs;
import io. jsonwebtoken. Jwts;
import io. jsonwebtoken. SignatureAlgorithm;
import org. springframework. stereotype. Component;
import java. util. Date;
@Component
public class TokenManager {
private long tokenExpiration = 24 * 60 * 60 * 1000 ;
private String tokenSignKey = "123456" ;
public String createToken ( String username) {
String token = Jwts. builder ( ) . setSubject ( username)
. setExpiration ( new Date ( System. currentTimeMillis ( ) + tokenExpiration) )
. signWith ( SignatureAlgorithm. HS512, tokenSignKey) . compressWith ( CompressionCodecs. GZIP) . compact ( ) ;
return token;
}
public String getUserFromToken ( String token) {
String user = Jwts. parser ( ) . setSigningKey ( tokenSignKey) . parseClaimsJws ( token) . getBody ( ) . getSubject ( ) ;
return user;
}
public void removeToken ( String token) {
}
}
4、未授权的统一处理方式
package com. yzpnb. serurity. security;
import com. yzpnb. common_utils. Result;
import com. yzpnb. serurity. utils. ResponseUtil;
import org. springframework. security. core. AuthenticationException;
import org. springframework. security. web. AuthenticationEntryPoint;
import javax. servlet. ServletException;
import javax. servlet. http. HttpServletRequest;
import javax. servlet. http. HttpServletResponse;
import java. io. IOException;
public class UnauthorizedEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence ( HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException, ServletException {
ResponseUtil. out ( response, Result. error ( ) ) ;
}
}
3、创建子模块,引入依赖并在gateway网关配置路由
< ! -- 引入自己的模块-- >
< dependency>
< groupId> com. yzpnb< / groupId>
< artifactId> spring_security< / artifactId>
< version> 1.0 - SNAPSHOT< / version>
< / dependency>
< ! -- fastjson-- >
< dependency>
< groupId> com. alibaba< / groupId>
< artifactId> fastjson< / artifactId>
< version> 1.2 .70 < / version>
< / dependency>
1、application.yml
server :
port : 8008
spring :
application :
name : service- acl
profiles :
active : dev
datasource :
driver-class-name : com.mysql.cj.jdbc.Driver
url : jdbc: mysql: //localhost: 3306/gulischool? serverTimeZone=UTC&useUnicode =true&characterEncoding =utf- 8&useSSL =false&allowPublicKeyRetrieval =true
username : root
password : 123456
jackson :
date-format : yyyy- MM- DD HH: mm: ss
time-zone : GMT+8
cloud :
nacos :
discovery :
server-addr : 127.0.0.1: 8848
redis :
host : 127.0.0.1
port : 6379
database : 0
timeout : 1800000
lettuce :
pool :
max-active : 20
max-wait : -1
max-idle : 5
min-idle : 0
mybatis-plus :
mapper-locations : classpath: com/yzpnb/aclservice/mapper/xml/*.xml
2、网关配置
3、启动类
package com. yzpnb. aclservice;
import org. mybatis. spring. annotation. MapperScan;
import org. springframework. boot. SpringApplication;
import org. springframework. boot. autoconfigure. SpringBootApplication;
import org. springframework. cloud. client. discovery. EnableDiscoveryClient;
import org. springframework. context. annotation. ComponentScan;
@SpringBootApplication
@ComponentScan ( "com.yzpnb" )
@EnableDiscoveryClient
@MapperScan ( "com.yzpnb.aclservice.mapper" )
public class AclApplication {
public static void main ( String[ ] args) {
SpringApplication. run ( AclApplication. class , args) ;
}
}
4、代码生成器生成MVC架构,如果你没有使用网关跨域,请添加跨域注解到启动类,实体类需要加入自动填充
4、递归显示所有菜单(因为我们不知道到底有多少级嵌套)
1、实体类中添加三个字段,用来表示自己的级别,1级为最上级,以及子菜单和是否选中
2、controller
package com. yzpnb. aclservice. controller;
import com. yzpnb. aclservice. entity. Permission;
import com. yzpnb. aclservice. service. PermissionService;
import com. yzpnb. common_utils. Result;
import io. swagger. annotations. ApiOperation;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. web. bind. annotation. *;
import java. util. List;
@RestController
@RequestMapping ( "/admin/acl/permission" )
@CrossOrigin
public class PermissionController {
@Autowired
private PermissionService permissionService;
@ApiOperation ( value = "查询所有菜单" )
@GetMapping
public Result indexAllPermission ( ) {
List< Permission> list = permissionService. queryAllMenu ( ) ;
return Result. ok ( ) . data ( "children" , list) ;
}
}
3、service
递归分析
先获取所有数据
取出所有一级菜单
进入递归,传入菜单id和所有菜单的集合
递归中每次遍历所有菜单,判断id是否与父id匹配,没有匹配表示已是最后一级,结束本次递归,有的话level+1,传入子级id和所有菜单继续遍历,最终递归完成,返回
package com. yzpnb. aclservice. service. impl;
import com. alibaba. fastjson. JSONObject;
import com. baomidou. mybatisplus. core. conditions. query. QueryWrapper;
import com. baomidou. mybatisplus. extension. service. impl. ServiceImpl;
import com. yzpnb. aclservice. entity. Permission;
import com. yzpnb. aclservice. entity. RolePermission;
import com. yzpnb. aclservice. entity. User;
import com. yzpnb. aclservice. helper. MemuHelper;
import com. yzpnb. aclservice. helper. PermissionHelper;
import com. yzpnb. aclservice. mapper. PermissionMapper;
import com. yzpnb. aclservice. service. PermissionService;
import com. yzpnb. aclservice. service. RolePermissionService;
import com. yzpnb. aclservice. service. UserService;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. stereotype. Service;
import org. springframework. util. StringUtils;
import java. util. ArrayList;
import java. util. List;
@Service
public class PermissionServiceImpl extends ServiceImpl < PermissionMapper, Permission> implements PermissionService {
@Autowired
private RolePermissionService rolePermissionService;
@Autowired
private UserService userService;
@Override
public List< Permission> queryAllMenu ( ) {
QueryWrapper< Permission> wrapper = new QueryWrapper < > ( ) ;
wrapper. orderByDesc ( "id" ) ;
List< Permission> permissionList = baseMapper. selectList ( wrapper) ;
List< Permission> resultList = bulid ( permissionList) ;
return resultList;
}
private static List< Permission> bulid ( List< Permission> treeNodes) {
List< Permission> trees = new ArrayList < > ( ) ;
for ( Permission treeNode : treeNodes) {
if ( "0" . equals ( treeNode. getPid ( ) ) ) {
treeNode. setLevel ( 1 ) ;
trees. add ( findChildren ( treeNode, treeNodes) ) ;
}
}
return trees;
}
private static Permission findChildren ( Permission treeNode, List< Permission> treeNodes) {
treeNode. setChildren ( new ArrayList < Permission> ( ) ) ;
for ( Permission it : treeNodes) {
if ( treeNode. getId ( ) . equals ( it. getPid ( ) ) ) {
int level = treeNode. getLevel ( ) + 1 ;
it. setLevel ( level) ;
if ( treeNode. getChildren ( ) == null) {
treeNode. setChildren ( new ArrayList < > ( ) ) ;
}
treeNode. getChildren ( ) . add ( findChildren ( it, treeNodes) ) ;
}
}
return treeNode;
}
}
4、测试
5、其它所有代码
1、controller
1、indexController
package com. yzpnb. aclservice. controller;
import com. alibaba. fastjson. JSONObject;
import com. yzpnb. aclservice. service. IndexService;
import com. yzpnb. common_utils. Result;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. security. core. context. SecurityContextHolder;
import org. springframework. web. bind. annotation. *;
import java. util. List;
import java. util. Map;
@RestController
@RequestMapping ( "/admin/acl/index" )
@CrossOrigin
public class IndexController {
@Autowired
private IndexService indexService;
@GetMapping ( "info" )
public Result info ( ) {
String username = SecurityContextHolder. getContext ( ) . getAuthentication ( ) . getName ( ) ;
Map< String, Object> userInfo = indexService. getUserInfo ( username) ;
return Result. ok ( ) . data ( userInfo) ;
}
@GetMapping ( "menu" )
public Result getMenu ( ) {
String username = SecurityContextHolder. getContext ( ) . getAuthentication ( ) . getName ( ) ;
List< JSONObject> permissionList = indexService. getMenu ( username) ;
return Result. ok ( ) . data ( "permissionList" , permissionList) ;
}
@PostMapping ( "logout" )
public Result logout ( ) {
return Result. ok ( ) ;
}
}
2、PermissionController
package com. yzpnb. aclservice. controller;
import com. yzpnb. aclservice. entity. Permission;
import com. yzpnb. aclservice. service. PermissionService;
import com. yzpnb. common_utils. Result;
import io. swagger. annotations. ApiOperation;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. web. bind. annotation. *;
import java. util. List;
@RestController
@RequestMapping ( "/admin/acl/permission" )
@CrossOrigin
public class PermissionController {
@Autowired
private PermissionService permissionService;
@ApiOperation ( value = "查询所有菜单" )
@GetMapping
public Result indexAllPermission ( ) {
List< Permission> list = permissionService. queryAllMenu ( ) ;
return Result. ok ( ) . data ( "children" , list) ;
}
@ApiOperation ( value = "递归删除菜单" )
@DeleteMapping ( "remove/{id}" )
public Result remove ( @PathVariable String id) {
permissionService. removeChildById ( id) ;
return Result. ok ( ) ;
}
@ApiOperation ( value = "给角色分配权限" )
@PostMapping ( "/doAssign" )
public Result doAssign ( String roleId, String[ ] permissionId) {
permissionService. saveRolePermissionRealtionShipGuli ( roleId, permissionId) ;
return Result. ok ( ) ;
}
@ApiOperation ( value = "根据角色获取菜单" )
@GetMapping ( "toAssign/{roleId}" )
public Result toAssign ( @PathVariable String roleId) {
List< Permission> list = permissionService. selectAllMenu ( roleId) ;
return Result. ok ( ) . data ( "children" , list) ;
}
@ApiOperation ( value = "新增菜单" )
@PostMapping ( "save" )
public Result save ( @RequestBody Permission permission) {
permissionService. save ( permission) ;
return Result. ok ( ) ;
}
@ApiOperation ( value = "修改菜单" )
@PutMapping ( "update" )
public Result updateById ( @RequestBody Permission permission) {
permissionService. updateById ( permission) ;
return Result. ok ( ) ;
}
}
3、RoleController
package com. yzpnb. aclservice. controller;
import com. baomidou. mybatisplus. core. conditions. query. QueryWrapper;
import com. baomidou. mybatisplus. extension. plugins. pagination. Page;
import com. yzpnb. aclservice. entity. Role;
import com. yzpnb. aclservice. service. RoleService;
import com. yzpnb. common_utils. Result;
import io. swagger. annotations. ApiOperation;
import io. swagger. annotations. ApiParam;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. util. StringUtils;
import org. springframework. web. bind. annotation. *;
import java. util. List;
@RestController
@RequestMapping ( "/admin/acl/role" )
@CrossOrigin
public class RoleController {
@Autowired
private RoleService roleService;
@ApiOperation ( value = "获取角色分页列表" )
@GetMapping ( "{page}/{limit}" )
public Result index (
@ApiParam ( name = "page" , value = "当前页码" , required = true )
@PathVariable Long page,
@ApiParam ( name = "limit" , value = "每页记录数" , required = true )
@PathVariable Long limit,
Role role) {
Page< Role> pageParam = new Page < > ( page, limit) ;
QueryWrapper< Role> wrapper = new QueryWrapper < > ( ) ;
if ( ! StringUtils. isEmpty ( role. getRoleName ( ) ) ) {
wrapper. like ( "role_name" , role. getRoleName ( ) ) ;
}
roleService. page ( pageParam, wrapper) ;
return Result. ok ( ) . data ( "items" , pageParam. getRecords ( ) ) . data ( "total" , pageParam. getTotal ( ) ) ;
}
@ApiOperation ( value = "获取角色" )
@GetMapping ( "get/{id}" )
public Result get ( @PathVariable String id) {
Role role = roleService. getById ( id) ;
return Result. ok ( ) . data ( "item" , role) ;
}
@ApiOperation ( value = "新增角色" )
@PostMapping ( "save" )
public Result save ( @RequestBody Role role) {
roleService. save ( role) ;
return Result. ok ( ) ;
}
@ApiOperation ( value = "修改角色" )
@PutMapping ( "update" )
public Result updateById ( @RequestBody Role role) {
roleService. updateById ( role) ;
return Result. ok ( ) ;
}
@ApiOperation ( value = "删除角色" )
@DeleteMapping ( "remove/{id}" )
public Result remove ( @PathVariable String id) {
roleService. removeById ( id) ;
return Result. ok ( ) ;
}
@ApiOperation ( value = "根据id列表删除角色" )
@DeleteMapping ( "batchRemove" )
public Result batchRemove ( @RequestBody List< String> idList) {
roleService. removeByIds ( idList) ;
return Result. ok ( ) ;
}
}
4、UserController
package com. yzpnb. aclservice. controller;
import com. baomidou. mybatisplus. core. conditions. query. QueryWrapper;
import com. baomidou. mybatisplus. core. metadata. IPage;
import com. baomidou. mybatisplus. extension. plugins. pagination. Page;
import com. yzpnb. aclservice. entity. User;
import com. yzpnb. aclservice. service. RoleService;
import com. yzpnb. aclservice. service. UserService;
import com. yzpnb. common_utils. MD5;
import com. yzpnb. common_utils. Result;
import io. swagger. annotations. ApiOperation;
import io. swagger. annotations. ApiParam;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. util. StringUtils;
import org. springframework. web. bind. annotation. *;
import java. util. List;
import java. util. Map;
@RestController
@RequestMapping ( "/admin/acl/user" )
@CrossOrigin
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
@ApiOperation ( value = "获取管理用户分页列表" )
@GetMapping ( "{page}/{limit}" )
public Result index (
@ApiParam ( name = "page" , value = "当前页码" , required = true )
@PathVariable Long page,
@ApiParam ( name = "limit" , value = "每页记录数" , required = true )
@PathVariable Long limit,
@ApiParam ( name = "courseQuery" , value = "查询对象" , required = false )
User userQueryVo) {
Page< User> pageParam = new Page < > ( page, limit) ;
QueryWrapper< User> wrapper = new QueryWrapper < > ( ) ;
if ( ! StringUtils. isEmpty ( userQueryVo. getUsername ( ) ) ) {
wrapper. like ( "username" , userQueryVo. getUsername ( ) ) ;
}
IPage< User> pageModel = userService. page ( pageParam, wrapper) ;
return Result. ok ( ) . data ( "items" , pageModel. getRecords ( ) ) . data ( "total" , pageModel. getTotal ( ) ) ;
}
@ApiOperation ( value = "新增管理用户" )
@PostMapping ( "save" )
public Result save ( @RequestBody User user) {
user. setPassword ( MD5. encrypt ( user. getPassword ( ) ) ) ;
userService. save ( user) ;
return Result. ok ( ) ;
}
@ApiOperation ( value = "修改管理用户" )
@PutMapping ( "update" )
public Result updateById ( @RequestBody User user) {
userService. updateById ( user) ;
return Result. ok ( ) ;
}
@ApiOperation ( value = "删除管理用户" )
@DeleteMapping ( "remove/{id}" )
public Result remove ( @PathVariable String id) {
userService. removeById ( id) ;
return Result. ok ( ) ;
}
@ApiOperation ( value = "根据id列表删除管理用户" )
@DeleteMapping ( "batchRemove" )
public Result batchRemove ( @RequestBody List< String> idList) {
userService. removeByIds ( idList) ;
return Result. ok ( ) ;
}
@ApiOperation ( value = "根据用户获取角色数据" )
@GetMapping ( "/toAssign/{userId}" )
public Result toAssign ( @PathVariable String userId) {
Map< String, Object> roleMap = roleService. findRoleByUserId ( userId) ;
return Result. ok ( ) . data ( roleMap) ;
}
@ApiOperation ( value = "根据用户分配角色" )
@PostMapping ( "/doAssign" )
public Result doAssign ( @RequestParam String userId, @RequestParam String[ ] roleId) {
roleService. saveUserRoleRealtionShip ( userId, roleId) ;
return Result. ok ( ) ;
}
}
2、实体类
1、Permission
package com. yzpnb. aclservice. entity;
import com. baomidou. mybatisplus. annotation. *;
import java. util. Date;
import java. io. Serializable;
import java. util. List;
import io. swagger. annotations. ApiModel;
import io. swagger. annotations. ApiModelProperty;
import lombok. Data;
import lombok. EqualsAndHashCode;
import lombok. experimental. Accessors;
@Data
@EqualsAndHashCode ( callSuper = false )
@Accessors ( chain = true )
@TableName ( "acl_permission" )
@ApiModel ( value= "Permission对象" , description= "权限" )
public class Permission implements Serializable {
private static final long serialVersionUID = 1 L;
@ApiModelProperty ( value = "编号" )
@TableId ( value = "id" , type = IdType. ID_WORKER_STR)
private String id;
@ApiModelProperty ( value = "所属上级" )
private String pid;
@ApiModelProperty ( value = "名称" )
private String name;
@ApiModelProperty ( value = "类型(1:菜单,2:按钮)" )
private Integer type;
@ApiModelProperty ( value = "权限值" )
private String permissionValue;
@ApiModelProperty ( value = "访问路径" )
private String path;
@ApiModelProperty ( value = "组件路径" )
private String component;
@ApiModelProperty ( value = "图标" )
private String icon;
@ApiModelProperty ( value = "状态(0:禁止,1:正常)" )
private Integer status;
@ApiModelProperty ( value = "层级" )
@TableField ( exist = false )
private Integer level;
@ApiModelProperty ( value = "下级" )
@TableField ( exist = false )
private List< Permission> children;
@ApiModelProperty ( value = "是否选中" )
@TableField ( exist = false )
private boolean isSelect;
@ApiModelProperty ( value = "逻辑删除 1(true)已删除, 0(false)未删除" )
private Boolean isDeleted;
@ApiModelProperty ( value = "创建时间" )
@TableField ( fill = FieldFill. INSERT)
private Date gmtCreate;
@ApiModelProperty ( value = "更新时间" )
@TableField ( fill = FieldFill. INSERT_UPDATE)
private Date gmtModified;
}
2、Role
package com. yzpnb. aclservice. entity;
import com. baomidou. mybatisplus. annotation. *;
import java. util. Date;
import java. io. Serializable;
import io. swagger. annotations. ApiModel;
import io. swagger. annotations. ApiModelProperty;
import lombok. Data;
import lombok. EqualsAndHashCode;
import lombok. experimental. Accessors;
@Data
@EqualsAndHashCode ( callSuper = false )
@Accessors ( chain = true )
@TableName ( "acl_role" )
@ApiModel ( value= "Role对象" , description= "" )
public class Role implements Serializable {
private static final long serialVersionUID = 1 L;
@ApiModelProperty ( value = "角色id" )
@TableId ( value = "id" , type = IdType. ID_WORKER_STR)
private String id;
@ApiModelProperty ( value = "角色名称" )
private String roleName;
@ApiModelProperty ( value = "角色编码" )
private String roleCode;
@ApiModelProperty ( value = "备注" )
private String remark;
@ApiModelProperty ( value = "逻辑删除 1(true)已删除, 0(false)未删除" )
private Boolean isDeleted;
@ApiModelProperty ( value = "创建时间" )
@TableField ( fill = FieldFill. INSERT)
private Date gmtCreate;
@ApiModelProperty ( value = "更新时间" )
@TableField ( fill = FieldFill. INSERT_UPDATE)
private Date gmtModified;
}
3、RolePermission
package com. yzpnb. aclservice. entity;
import com. baomidou. mybatisplus. annotation. *;
import java. util. Date;
import java. io. Serializable;
import io. swagger. annotations. ApiModel;
import io. swagger. annotations. ApiModelProperty;
import lombok. Data;
import lombok. EqualsAndHashCode;
import lombok. experimental. Accessors;
@Data
@EqualsAndHashCode ( callSuper = false )
@Accessors ( chain = true )
@TableName ( "acl_role_permission" )
@ApiModel ( value= "RolePermission对象" , description= "角色权限" )
public class RolePermission implements Serializable {
private static final long serialVersionUID = 1 L;
@TableId ( value = "id" , type = IdType. ID_WORKER_STR)
private String id;
private String roleId;
private String permissionId;
@ApiModelProperty ( value = "逻辑删除 1(true)已删除, 0(false)未删除" )
private Boolean isDeleted;
@ApiModelProperty ( value = "创建时间" )
@TableField ( fill = FieldFill. INSERT)
private Date gmtCreate;
@ApiModelProperty ( value = "更新时间" )
@TableField ( fill = FieldFill. INSERT_UPDATE)
private Date gmtModified;
}
4、User
package com. yzpnb. aclservice. entity;
import com. baomidou. mybatisplus. annotation. *;
import java. util. Date;
import java. io. Serializable;
import io. swagger. annotations. ApiModel;
import io. swagger. annotations. ApiModelProperty;
import lombok. Data;
import lombok. EqualsAndHashCode;
import lombok. experimental. Accessors;
@Data
@EqualsAndHashCode ( callSuper = false )
@Accessors ( chain = true )
@TableName ( "acl_user" )
@ApiModel ( value= "User对象" , description= "用户表" )
public class User implements Serializable {
private static final long serialVersionUID = 1 L;
@ApiModelProperty ( value = "会员id" )
@TableId ( value = "id" , type = IdType. ID_WORKER_STR)
private String id;
@ApiModelProperty ( value = "微信openid" )
private String username;
@ApiModelProperty ( value = "密码" )
private String password;
@ApiModelProperty ( value = "昵称" )
private String nickName;
@ApiModelProperty ( value = "用户头像" )
private String salt;
@ApiModelProperty ( value = "用户签名" )
private String token;
@ApiModelProperty ( value = "逻辑删除 1(true)已删除, 0(false)未删除" )
private Boolean isDeleted;
@ApiModelProperty ( value = "创建时间" )
@TableField ( fill = FieldFill. INSERT)
private Date gmtCreate;
@ApiModelProperty ( value = "更新时间" )
@TableField ( fill = FieldFill. INSERT_UPDATE)
private Date gmtModified;
}
5、UserRole
package com. yzpnb. aclservice. entity;
import com. baomidou. mybatisplus. annotation. *;
import java. util. Date;
import java. io. Serializable;
import io. swagger. annotations. ApiModel;
import io. swagger. annotations. ApiModelProperty;
import lombok. Data;
import lombok. EqualsAndHashCode;
import lombok. experimental. Accessors;
@Data
@EqualsAndHashCode ( callSuper = false )
@Accessors ( chain = true )
@TableName ( "acl_user_role" )
@ApiModel ( value= "UserRole对象" , description= "" )
public class UserRole implements Serializable {
private static final long serialVersionUID = 1 L;
@ApiModelProperty ( value = "主键id" )
@TableId ( value = "id" , type = IdType. ID_WORKER_STR)
private String id;
@ApiModelProperty ( value = "角色id" )
private String roleId;
@ApiModelProperty ( value = "用户id" )
private String userId;
@ApiModelProperty ( value = "逻辑删除 1(true)已删除, 0(false)未删除" )
private Boolean isDeleted;
@ApiModelProperty ( value = "创建时间" )
@TableField ( fill = FieldFill. INSERT)
private Date gmtCreate;
@ApiModelProperty ( value = "更新时间" )
@TableField ( fill = FieldFill. INSERT_UPDATE)
private Date gmtModified;
}
3、service
1、IndexServiceImpl
package com. yzpnb. aclservice. service. impl;
import com. alibaba. fastjson. JSONObject;
import com. yzpnb. aclservice. entity. Role;
import com. yzpnb. aclservice. entity. User;
import com. yzpnb. aclservice. service. IndexService;
import com. yzpnb. aclservice. service. PermissionService;
import com. yzpnb. aclservice. service. RoleService;
import com. yzpnb. aclservice. service. UserService;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. data. redis. core. RedisTemplate;
import org. springframework. stereotype. Service;
import java. util. HashMap;
import java. util. List;
import java. util. Map;
import java. util. stream. Collectors;
@Service
public class IndexServiceImpl implements IndexService {
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
@Autowired
private PermissionService permissionService;
@Autowired
private RedisTemplate redisTemplate;
public Map< String, Object> getUserInfo ( String username) {
Map< String, Object> result = new HashMap < > ( ) ;
User user = userService. selectByUsername ( username) ;
if ( null == user) {
}
List< Role> roleList = roleService. selectRoleByUserId ( user. getId ( ) ) ;
List< String> roleNameList = roleList. stream ( ) . map ( item - > item. getRoleName ( ) ) . collect ( Collectors. toList ( ) ) ;
if ( roleNameList. size ( ) == 0 ) {
roleNameList. add ( "" ) ;
}
List< String> permissionValueList = permissionService. selectPermissionValueByUserId ( user. getId ( ) ) ;
redisTemplate. opsForValue ( ) . set ( username, permissionValueList) ;
result. put ( "name" , user. getUsername ( ) ) ;
result. put ( "avatar" , "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif" ) ;
result. put ( "roles" , roleNameList) ;
result. put ( "permissionValueList" , permissionValueList) ;
return result;
}
public List< JSONObject> getMenu ( String username) {
User user = userService. selectByUsername ( username) ;
List< JSONObject> permissionList = permissionService. selectPermissionByUserId ( user. getId ( ) ) ;
return permissionList;
}
}
2、PermissionServiceImpl
package com. yzpnb. aclservice. service. impl;
import com. alibaba. fastjson. JSONObject;
import com. baomidou. mybatisplus. core. conditions. query. QueryWrapper;
import com. baomidou. mybatisplus. extension. service. impl. ServiceImpl;
import com. yzpnb. aclservice. entity. Permission;
import com. yzpnb. aclservice. entity. RolePermission;
import com. yzpnb. aclservice. entity. User;
import com. yzpnb. aclservice. helper. MemuHelper;
import com. yzpnb. aclservice. helper. PermissionHelper;
import com. yzpnb. aclservice. mapper. PermissionMapper;
import com. yzpnb. aclservice. service. PermissionService;
import com. yzpnb. aclservice. service. RolePermissionService;
import com. yzpnb. aclservice. service. UserService;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. stereotype. Service;
import org. springframework. util. StringUtils;
import java. util. ArrayList;
import java. util. List;
@Service
public class PermissionServiceImpl extends ServiceImpl < PermissionMapper, Permission> implements PermissionService {
@Autowired
private RolePermissionService rolePermissionService;
@Autowired
private UserService userService;
@Override
public List< Permission> queryAllMenu ( ) {
QueryWrapper< Permission> wrapper = new QueryWrapper < > ( ) ;
wrapper. orderByDesc ( "id" ) ;
List< Permission> permissionList = baseMapper. selectList ( wrapper) ;
List< Permission> resultList = bulid ( permissionList) ;
return resultList;
}
private static List< Permission> bulid ( List< Permission> treeNodes) {
List< Permission> trees = new ArrayList < > ( ) ;
for ( Permission treeNode : treeNodes) {
if ( "0" . equals ( treeNode. getPid ( ) ) ) {
treeNode. setLevel ( 1 ) ;
trees. add ( findChildren ( treeNode, treeNodes) ) ;
}
}
return trees;
}
private static Permission findChildren ( Permission treeNode, List< Permission> treeNodes) {
treeNode. setChildren ( new ArrayList < Permission> ( ) ) ;
for ( Permission it : treeNodes) {
if ( treeNode. getId ( ) . equals ( it. getPid ( ) ) ) {
int level = treeNode. getLevel ( ) + 1 ;
it. setLevel ( level) ;
if ( treeNode. getChildren ( ) == null) {
treeNode. setChildren ( new ArrayList < > ( ) ) ;
}
treeNode. getChildren ( ) . add ( findChildren ( it, treeNodes) ) ;
}
}
return treeNode;
}
@Override
public List< Permission> selectAllMenu ( String roleId) {
List< Permission> allPermissionList = baseMapper. selectList ( new QueryWrapper < Permission> ( ) . orderByAsc ( "CAST(id AS SIGNED)" ) ) ;
List< RolePermission> rolePermissionList = rolePermissionService. list ( new QueryWrapper < RolePermission> ( ) . eq ( "role_id" , roleId) ) ;
for ( int i = 0 ; i < allPermissionList. size ( ) ; i++ ) {
Permission permission = allPermissionList. get ( i) ;
for ( int m = 0 ; m < rolePermissionList. size ( ) ; m++ ) {
RolePermission rolePermission = rolePermissionList. get ( m) ;
if ( rolePermission. getPermissionId ( ) . equals ( permission. getId ( ) ) ) {
permission. setSelect ( true ) ;
}
}
}
List< Permission> permissionList = bulid ( allPermissionList) ;
return permissionList;
}
@Override
public void saveRolePermissionRealtionShip ( String roleId, String[ ] permissionIds) {
rolePermissionService. remove ( new QueryWrapper < RolePermission> ( ) . eq ( "role_id" , roleId) ) ;
List< RolePermission> rolePermissionList = new ArrayList < > ( ) ;
for ( String permissionId : permissionIds) {
if ( StringUtils. isEmpty ( permissionId) ) continue ;
RolePermission rolePermission = new RolePermission ( ) ;
rolePermission. setRoleId ( roleId) ;
rolePermission. setPermissionId ( permissionId) ;
rolePermissionList. add ( rolePermission) ;
}
rolePermissionService. saveBatch ( rolePermissionList) ;
}
@Override
public void removeChildById ( String id) {
List< String> idList = new ArrayList < > ( ) ;
this . selectChildListById ( id, idList) ;
idList. add ( id) ;
baseMapper. deleteBatchIds ( idList) ;
}
@Override
public List< String> selectPermissionValueByUserId ( String id) {
List< String> selectPermissionValueList = null;
if ( this . isSysAdmin ( id) ) {
selectPermissionValueList = baseMapper. selectAllPermissionValue ( ) ;
} else {
selectPermissionValueList = baseMapper. selectPermissionValueByUserId ( id) ;
}
return selectPermissionValueList;
}
@Override
public List< JSONObject> selectPermissionByUserId ( String userId) {
List< Permission> selectPermissionList = null;
if ( this . isSysAdmin ( userId) ) {
selectPermissionList = baseMapper. selectList ( null) ;
} else {
selectPermissionList = baseMapper. selectPermissionByUserId ( userId) ;
}
List< Permission> permissionList = PermissionHelper. bulid ( selectPermissionList) ;
List< JSONObject> result = MemuHelper. bulid ( permissionList) ;
return result;
}
private boolean isSysAdmin ( String userId) {
User user = userService. getById ( userId) ;
if ( null != user && "admin" . equals ( user. getUsername ( ) ) ) {
return true ;
}
return false ;
}
private void selectChildListById ( String id, List< String> idList) {
List< Permission> childList = baseMapper. selectList ( new QueryWrapper < Permission> ( ) . eq ( "pid" , id) . select ( "id" ) ) ;
childList. stream ( ) . forEach ( item - > {
idList. add ( item. getId ( ) ) ;
this . selectChildListById ( item. getId ( ) , idList) ;
} ) ;
}
private void selectPermissionChildById ( String id, List< String> idList) {
QueryWrapper< Permission> wrapper = new QueryWrapper < > ( ) ;
wrapper. eq ( "pid" , id) ;
wrapper. select ( "id" ) ;
List< Permission> childIdList = baseMapper. selectList ( wrapper) ;
childIdList. stream ( ) . forEach ( item - > {
idList. add ( item. getId ( ) ) ;
this . selectPermissionChildById ( item. getId ( ) , idList) ;
} ) ;
}
@Override
public void saveRolePermissionRealtionShipGuli ( String roleId, String[ ] permissionIds) {
List< RolePermission> rolePermissionList = new ArrayList < > ( ) ;
for ( String perId : permissionIds) {
RolePermission rolePermission = new RolePermission ( ) ;
rolePermission. setRoleId ( roleId) ;
rolePermission. setPermissionId ( perId) ;
rolePermissionList. add ( rolePermission) ;
}
rolePermissionService. saveBatch ( rolePermissionList) ;
}
}
3、RolePermissionServiceImpl
package com. yzpnb. aclservice. service. impl;
import com. baomidou. mybatisplus. extension. service. impl. ServiceImpl;
import com. yzpnb. aclservice. entity. RolePermission;
import com. yzpnb. aclservice. mapper. RolePermissionMapper;
import com. yzpnb. aclservice. service. RolePermissionService;
import org. springframework. stereotype. Service;
@Service
public class RolePermissionServiceImpl extends ServiceImpl < RolePermissionMapper, RolePermission> implements RolePermissionService {
}
4、RoleServiceImpl
package com. yzpnb. aclservice. service. impl;
import com. baomidou. mybatisplus. core. conditions. query. QueryWrapper;
import com. baomidou. mybatisplus. extension. service. impl. ServiceImpl;
import com. yzpnb. aclservice. entity. Role;
import com. yzpnb. aclservice. entity. UserRole;
import com. yzpnb. aclservice. mapper. RoleMapper;
import com. yzpnb. aclservice. service. RoleService;
import com. yzpnb. aclservice. service. UserRoleService;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. stereotype. Service;
import org. springframework. util. StringUtils;
import java. util. ArrayList;
import java. util. HashMap;
import java. util. List;
import java. util. Map;
import java. util. stream. Collectors;
@Service
public class RoleServiceImpl extends ServiceImpl < RoleMapper, Role> implements RoleService {
@Autowired
private UserRoleService userRoleService;
@Override
public Map< String, Object> findRoleByUserId ( String userId) {
List< Role> allRolesList = baseMapper. selectList ( null) ;
List< UserRole> existUserRoleList = userRoleService. list ( new QueryWrapper < UserRole> ( ) . eq ( "user_id" , userId) . select ( "role_id" ) ) ;
List< String> existRoleList = existUserRoleList. stream ( ) . map ( c- > c. getRoleId ( ) ) . collect ( Collectors. toList ( ) ) ;
List< Role> assignRoles = new ArrayList < Role> ( ) ;
for ( Role role : allRolesList) {
if ( existRoleList. contains ( role. getId ( ) ) ) {
assignRoles. add ( role) ;
}
}
Map< String, Object> roleMap = new HashMap < > ( ) ;
roleMap. put ( "assignRoles" , assignRoles) ;
roleMap. put ( "allRolesList" , allRolesList) ;
return roleMap;
}
@Override
public void saveUserRoleRealtionShip ( String userId, String[ ] roleIds) {
userRoleService. remove ( new QueryWrapper < UserRole> ( ) . eq ( "user_id" , userId) ) ;
List< UserRole> userRoleList = new ArrayList < > ( ) ;
for ( String roleId : roleIds) {
if ( StringUtils. isEmpty ( roleId) ) continue ;
UserRole userRole = new UserRole ( ) ;
userRole. setUserId ( userId) ;
userRole. setRoleId ( roleId) ;
userRoleList. add ( userRole) ;
}
userRoleService. saveBatch ( userRoleList) ;
}
@Override
public List< Role> selectRoleByUserId ( String id) {
List< UserRole> userRoleList = userRoleService. list ( new QueryWrapper < UserRole> ( ) . eq ( "user_id" , id) . select ( "role_id" ) ) ;
List< String> roleIdList = userRoleList. stream ( ) . map ( item - > item. getRoleId ( ) ) . collect ( Collectors. toList ( ) ) ;
List< Role> roleList = new ArrayList < > ( ) ;
if ( roleIdList. size ( ) > 0 ) {
roleList = baseMapper. selectBatchIds ( roleIdList) ;
}
return roleList;
}
}
5、UserDetailsServiceImpl
package com. yzpnb. aclservice. service. impl;
import com. yzpnb. aclservice. entity. User;
import com. yzpnb. aclservice. service. PermissionService;
import com. yzpnb. aclservice. service. UserService;
import com. yzpnb. serurity. entity. SecurityUser;
import org. springframework. beans. BeanUtils;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. security. core. userdetails. UserDetails;
import org. springframework. security. core. userdetails. UserDetailsService;
import org. springframework. security. core. userdetails. UsernameNotFoundException;
import org. springframework. stereotype. Service;
import java. util. List;
@Service ( "userDetailsService" )
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserService userService;
@Autowired
private PermissionService permissionService;
@Override
public UserDetails loadUserByUsername ( String username) throws UsernameNotFoundException {
User user = userService. selectByUsername ( username) ;
if ( null == user) {
}
com. yzpnb. serurity. entity. User curUser = new com. yzpnb. serurity. entity. User ( ) ;
BeanUtils. copyProperties ( user, curUser) ;
List< String> authorities = permissionService. selectPermissionValueByUserId ( user. getId ( ) ) ;
SecurityUser securityUser = new SecurityUser ( curUser) ;
securityUser. setPermissionValueList ( authorities) ;
return securityUser;
}
}
6、UserRoleServiceImpl
package com. yzpnb. aclservice. service. impl;
import com. baomidou. mybatisplus. extension. service. impl. ServiceImpl;
import com. yzpnb. aclservice. entity. UserRole;
import com. yzpnb. aclservice. mapper. UserRoleMapper;
import com. yzpnb. aclservice. service. UserRoleService;
import org. springframework. stereotype. Service;
@Service
public class UserRoleServiceImpl extends ServiceImpl < UserRoleMapper, UserRole> implements UserRoleService {
}
7、UserServiceImpl
package com. yzpnb. aclservice. service. impl;
import com. baomidou. mybatisplus. core. conditions. query. QueryWrapper;
import com. baomidou. mybatisplus. extension. service. impl. ServiceImpl;
import com. yzpnb. aclservice. entity. User;
import com. yzpnb. aclservice. mapper. UserMapper;
import com. yzpnb. aclservice. service. UserService;
import org. springframework. stereotype. Service;
@Service
public class UserServiceImpl extends ServiceImpl < UserMapper, User> implements UserService {
@Override
public User selectByUsername ( String username) {
return baseMapper. selectOne ( new QueryWrapper < User> ( ) . eq ( "username" , username) ) ;
}
}
4、mapper
1、PermissionMapper
< ? xml version= "1.0" encoding= "UTF-8" ? >
< ! DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
< mapper namespace= "com.yzpnb.aclservice.mapper.PermissionMapper" >
< resultMap id= "permissionMap" type= "com.yzpnb.aclservice.entity.Permission" >
< result property= "id" column= "id" / >
< result property= "pid" column= "pid" / >
< result property= "name" column= "name" / >
< result property= "type" column= "type" / >
< result property= "permissionValue" column= "permission_value" / >
< result property= "path" column= "path" / >
< result property= "component" column= "component" / >
< result property= "icon" column= "icon" / >
< result property= "status" column= "status" / >
< result property= "isDeleted" column= "is_deleted" / >
< result property= "gmtCreate" column= "gmt_create" / >
< result property= "gmtModified" column= "gmt_modified" / >
< / resultMap>
< ! -- 用于select查询公用抽取的列 -- >
< sql id= "columns" >
p. id, p. pid, p. name, p. type, p. permission_value, path, p. component, p. icon, p. status, p. is_deleted, p. gmt_create, p. gmt_modified
< / sql>
< select id= "selectPermissionByUserId" resultMap= "permissionMap" >
select
< include refid= "columns" / >
from acl_user_role ur
inner join acl_role_permission rp on rp. role_id = ur. role_id
inner join acl_permission p on p. id = rp. permission_id
where ur. user_id = #{ userId}
and ur. is_deleted = 0
and rp. is_deleted = 0
and p. is_deleted = 0
< / select>
< select id= "selectPermissionValueByUserId" resultType= "String" >
select
p. permission_value
from acl_user_role ur
inner join acl_role_permission rp on rp. role_id = ur. role_id
inner join acl_permission p on p. id = rp. permission_id
where ur. user_id = #{ userId}
and p. type = 2
and ur. is_deleted = 0
and rp. is_deleted = 0
and p. is_deleted = 0
< / select>
< select id= "selectAllPermissionValue" resultType= "String" >
select
permission_value
from acl_permission
where type = 2
and is_deleted = 0
< / select>
< / mapper>