80、SpringBoot3 SpringSecurity Mybatisplus最新版 整合 实现登入权限控制
1、导入pom依
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for sys_menu -- ---------------------------- DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE `sys_menu` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', `parent_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '所属上级', `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称', `type` tinyint(3) NOT NULL DEFAULT 0 COMMENT '类型(0:目录,1:菜单,2:按钮)', `path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由地址', `component` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件路径', `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限标识', `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标', `sort_value` int(11) NULL DEFAULT NULL COMMENT '排序', `status` tinyint(4) NULL DEFAULT NULL COMMENT '状态(0:禁止,1:正常)', `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', `is_deleted` tinyint(3) NOT NULL DEFAULT 0 COMMENT '删除标记(0:不可用 1:可用)', PRIMARY KEY (`id`) USING BTREE, INDEX `idx_parent_id`(`parent_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 58 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_menu -- ---------------------------- INSERT INTO `sys_menu` VALUES (2, 0, '系统管理', 0, 'system', 'Layout', NULL, 'el-icon-s-tools', 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:23:24', 0); INSERT INTO `sys_menu` VALUES (3, 2, '用户管理', 1, 'sysUser', 'system/sysUser/list', '', 'el-icon-s-custom', 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:47', 0); INSERT INTO `sys_menu` VALUES (4, 2, '角色管理', 1, 'sysRole', 'system/sysRole/list', '', 'el-icon-user-solid', 2, 1, '2021-05-31 18:05:37', '2022-06-09 09:37:18', 0); INSERT INTO `sys_menu` VALUES (5, 2, '菜单管理', 1, 'sysMenu', 'system/sysMenu/list', '', 'el-icon-s-unfold', 3, 1, '2021-05-31 18:05:37', '2022-06-09 09:37:21', 0); INSERT INTO `sys_menu` VALUES (6, 3, '查看', 2, NULL, NULL, 'bnt.sysUser.list', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (7, 3, '添加', 2, NULL, NULL, 'bnt.sysUser.add', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (8, 3, '修改', 2, NULL, NULL, 'bnt.sysUser.update', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (9, 3, '删除', 2, NULL, NULL, 'bnt.sysUser.remove', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (10, 4, '查看', 2, NULL, NULL, 'bnt.sysRole.list', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (11, 4, '添加', 2, NULL, NULL, 'bnt.sysRole.add', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (12, 4, '修改', 2, NULL, NULL, 'bnt.sysRole.update', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (13, 4, '删除', 2, NULL, NULL, 'bnt.sysRole.remove', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (14, 5, '查看', 2, NULL, NULL, 'bnt.sysMenu.list', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (15, 5, '添加', 2, NULL, NULL, 'bnt.sysMenu.add', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (16, 5, '修改', 2, NULL, NULL, 'bnt.sysMenu.update', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (17, 5, '删除', 2, NULL, NULL, 'bnt.sysMenu.remove', NULL, 1, 1, '2021-05-31 18:05:37', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (18, 3, '分配角色', 2, NULL, NULL, 'bnt.sysUser.assignRole', NULL, 1, 1, '2022-05-23 17:14:32', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (19, 4, '分配权限', 2, 'assignAuth', 'system/sysRole/assignAuth', 'bnt.sysRole.assignAuth', NULL, 1, 1, '2022-05-23 17:18:14', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (20, 2, '部门管理', 1, 'sysDept', 'system/sysDept/list', '', 'el-icon-s-operation', 4, 1, '2022-05-24 10:07:05', '2022-06-09 09:38:12', 0); INSERT INTO `sys_menu` VALUES (21, 20, '查看', 2, NULL, NULL, 'bnt.sysDept.list', NULL, 1, 1, '2022-05-24 10:07:44', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (22, 2, '岗位管理', 1, 'sysPost', 'system/sysPost/list', '', 'el-icon-more-outline', 5, 1, '2022-05-24 10:25:30', '2022-06-09 09:38:13', 0); INSERT INTO `sys_menu` VALUES (23, 22, '查看', 2, NULL, NULL, 'bnt.sysPost.list', NULL, 1, 1, '2022-05-24 10:25:45', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (24, 20, '添加', 2, NULL, NULL, 'bnt.sysDept.add', NULL, 1, 1, '2022-05-25 15:31:27', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (25, 20, '修改', 2, NULL, NULL, 'bnt.sysDept.update', NULL, 1, 1, '2022-05-25 15:31:41', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (26, 20, '删除', 2, NULL, NULL, 'bnt.sysDept.remove', NULL, 1, 1, '2022-05-25 15:31:59', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (27, 22, '添加', 2, NULL, NULL, 'bnt.sysPost.add', NULL, 1, 1, '2022-05-25 15:32:44', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (28, 22, '修改', 2, NULL, NULL, 'bnt.sysPost.update', NULL, 1, 1, '2022-05-25 15:32:58', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (29, 22, '删除', 2, NULL, NULL, 'bnt.sysPost.remove', NULL, 1, 1, '2022-05-25 15:33:11', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (30, 34, '操作日志', 1, 'sysOperLog', 'system/sysOperLog/list', '', 'el-icon-document-remove', 7, 1, '2022-05-26 16:09:59', '2022-06-09 09:39:23', 0); INSERT INTO `sys_menu` VALUES (31, 30, '查看', 2, NULL, NULL, 'bnt.sysOperLog.list', NULL, 1, 1, '2022-05-26 16:10:17', '2022-06-09 09:22:38', 0); INSERT INTO `sys_menu` VALUES (32, 34, '登录日志', 1, 'sysLoginLog', 'system/sysLoginLog/list', '', 'el-icon-s-goods', 8, 1, '2022-05-26 16:36:13', '2022-06-09 09:39:24', 0); INSERT INTO `sys_menu` VALUES (33, 32, '查看', 2, NULL, NULL, 'bnt.sysLoginLog.list', NULL, 1, 1, '2022-05-26 16:36:31', '2022-06-09 09:36:36', 0); INSERT INTO `sys_menu` VALUES (34, 2, '日志管理', 0, 'log', 'ParentView', '', 'el-icon-tickets', 6, 1, '2022-05-31 13:23:07', '2022-06-09 09:39:22', 0); INSERT INTO `sys_menu` VALUES (35, 0, '审批设置', 0, 'processSet', 'Layout', '', 'el-icon-setting', 1, 1, '2022-12-01 09:32:46', '2022-12-01 09:32:46', 0); INSERT INTO `sys_menu` VALUES (36, 35, '审批模板', 1, 'processTemplate', 'processSet/processTemplate/list', '', 'el-icon-s-help', 2, 1, '2022-12-01 09:37:08', '2022-12-19 14:10:48', 0); INSERT INTO `sys_menu` VALUES (37, 36, '查看', 2, '', '', 'bnt.processTemplate.list', '', 1, 1, '2022-12-01 09:37:49', '2022-12-01 09:37:49', 0); INSERT INTO `sys_menu` VALUES (38, 36, '审批模板设置', 2, 'templateSet', 'processSet/processTemplate/templateSet', 'bnt.processTemplate.templateSet', '', 1, 1, '2022-12-01 14:52:08', '2022-12-13 18:11:56', 0); INSERT INTO `sys_menu` VALUES (39, 35, '审批类型', 1, 'processType', 'processSet/processType/list', '', 'el-icon-s-unfold', 1, 1, '2022-12-02 14:46:18', '2022-12-13 18:12:24', 0); INSERT INTO `sys_menu` VALUES (40, 39, '查看', 2, '', '', 'bnt.processType.list', '', 1, 1, '2022-12-02 14:46:41', '2022-12-02 14:46:41', 0); INSERT INTO `sys_menu` VALUES (41, 0, '审批管理', 0, 'processMgr', 'Layout', '', 'el-icon-more-outline', 1, 1, '2022-12-02 14:48:11', '2022-12-20 09:29:30', 0); INSERT INTO `sys_menu` VALUES (42, 41, '审批列表', 1, 'process', 'processMgr/process/list', '', 'el-icon-document-remove', 1, 1, '2022-12-02 14:49:06', '2022-12-02 14:59:17', 0); INSERT INTO `sys_menu` VALUES (43, 42, '查看', 2, '', '', 'bnt.process.list', '', 1, 1, '2022-12-02 14:49:24', '2022-12-02 14:49:24', 0); INSERT INTO `sys_menu` VALUES (44, 36, '在线流程设置', 2, 'onlineProcessSet', 'processSet/processTemplate/onlineProcessSet', 'bnt.processTemplate.onlineProcessSet', '', 1, 1, '2022-12-08 10:13:15', '2022-12-19 18:57:35', 0); INSERT INTO `sys_menu` VALUES (45, 39, '添加', 2, '', '', 'bnt.processType.add', '', 1, 1, '2022-12-09 09:14:53', '2022-12-09 09:14:53', 0); INSERT INTO `sys_menu` VALUES (46, 39, '修改', 2, '', '', 'bnt.processType.update', '', 1, 1, '2022-12-09 09:15:10', '2022-12-09 09:15:10', 0); INSERT INTO `sys_menu` VALUES (47, 39, '删除', 2, '', '', 'bnt.processType.remove', '', 1, 1, '2022-12-09 09:15:25', '2022-12-09 09:15:25', 0); INSERT INTO `sys_menu` VALUES (48, 36, '删除', 2, '', '', 'bnt.processTemplate.remove', '', 1, 1, '2022-12-09 09:22:29', '2022-12-09 09:22:29', 0); INSERT INTO `sys_menu` VALUES (49, 36, '发布', 2, '', '', 'bnt.processTemplate.publish', '', 1, 1, '2022-12-09 09:24:47', '2022-12-09 09:24:47', 0); INSERT INTO `sys_menu` VALUES (50, 0, '公众号菜单', 0, 'wechat', 'Layout', '', 'el-icon-s-operation', 1, 1, '2022-12-13 09:06:58', '2022-12-21 11:20:55', 0); INSERT INTO `sys_menu` VALUES (51, 50, '菜单列表', 1, 'menu', 'wechat/menu/list', '', 'el-icon-s-help', 1, 1, '2022-12-13 09:07:52', '2022-12-13 09:09:49', 0); INSERT INTO `sys_menu` VALUES (52, 51, '查看', 2, '', '', 'bnt.menu.list', '', 1, 1, '2022-12-13 09:08:48', '2022-12-13 17:58:23', 0); INSERT INTO `sys_menu` VALUES (53, 51, '添加', 2, '', '', 'bnt.menu.add', '', 1, 1, '2022-12-13 16:29:25', '2022-12-13 17:58:34', 0); INSERT INTO `sys_menu` VALUES (54, 51, '修改', 2, '', '', 'bnt.menu.update', '', 1, 1, '2022-12-13 16:29:41', '2022-12-13 17:58:42', 0); INSERT INTO `sys_menu` VALUES (55, 51, '删除', 2, '', '', 'bnt.menu.remove', '', 1, 1, '2022-12-13 16:29:59', '2022-12-13 17:58:47', 0); INSERT INTO `sys_menu` VALUES (56, 51, '删除微信菜单', 2, '', '', 'bnt.menu.removeMenu', '', 1, 1, '2022-12-13 16:30:36', '2022-12-13 17:58:54', 0); INSERT INTO `sys_menu` VALUES (57, 51, '同步微信菜单', 2, '', '', 'bnt.menu.syncMenu', '', 1, 1, '2022-12-13 16:31:00', '2022-12-13 17:59:01', 0); -- ---------------------------- -- Table structure for sys_role -- ---------------------------- DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '角色id', `role_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '角色名称', `role_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色编码', `description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述', `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', `is_deleted` tinyint(3) NOT NULL DEFAULT 0 COMMENT '删除标记(0:不可用 1:可用)', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_role -- ---------------------------- INSERT INTO `sys_role` VALUES (1, '系统管理员', 'SYSTEM', '系统管理员', '2021-05-31 18:09:18', '2022-06-08 09:21:10', 0); INSERT INTO `sys_role` VALUES (2, '普通管理员', 'COMMON', '普通管理员', '2021-06-01 08:38:40', '2022-02-24 10:42:46', 0); INSERT INTO `sys_role` VALUES (8, '用户管理员', 'yhgly', NULL, '2022-06-08 17:39:04', '2022-06-08 17:39:04', 0); -- ---------------------------- -- Table structure for sys_role_menu -- ---------------------------- DROP TABLE IF EXISTS `sys_role_menu`; CREATE TABLE `sys_role_menu` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `role_id` bigint(20) NOT NULL DEFAULT 0, `menu_id` bigint(11) NOT NULL DEFAULT 0, `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', `is_deleted` tinyint(3) NOT NULL DEFAULT 0 COMMENT '删除标记(0:不可用 1:可用)', PRIMARY KEY (`id`) USING BTREE, INDEX `idx_role_id`(`role_id`) USING BTREE, INDEX `idx_menu_id`(`menu_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色菜单' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_role_menu -- ---------------------------- INSERT INTO `sys_role_menu` VALUES (1, 2, 2, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (2, 2, 3, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (3, 2, 6, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (4, 2, 7, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (5, 2, 8, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (6, 2, 9, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (7, 2, 18, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (8, 2, 4, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (9, 2, 10, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (10, 2, 11, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (11, 2, 12, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (12, 2, 13, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (13, 2, 19, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (14, 2, 5, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (15, 2, 14, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (16, 2, 15, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (17, 2, 16, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (18, 2, 17, '2022-06-02 16:11:27', '2022-06-02 16:16:10', 1); INSERT INTO `sys_role_menu` VALUES (19, 2, 2, '2022-06-02 16:16:10', '2022-06-09 09:26:34', 1); INSERT INTO `sys_role_menu` VALUES (20, 2, 3, '2022-06-02 16:16:10', '2022-06-09 09:26:34', 1); INSERT INTO `sys_role_menu` VALUES (21, 2, 6, '2022-06-02 16:16:10', '2022-06-09 09:26:34', 1); INSERT INTO `sys_role_menu` VALUES (22, 2, 7, '2022-06-02 16:16:10', '2022-06-09 09:26:34', 1); INSERT INTO `sys_role_menu` VALUES (23, 2, 8, '2022-06-02 16:16:10', '2022-06-09 09:26:34', 1); INSERT INTO `sys_role_menu` VALUES (24, 2, 2, '2022-06-09 09:26:34', '2022-06-09 09:26:34', 0); INSERT INTO `sys_role_menu` VALUES (25, 2, 3, '2022-06-09 09:26:34', '2022-06-09 09:26:34', 0); INSERT INTO `sys_role_menu` VALUES (26, 2, 6, '2022-06-09 09:26:34', '2022-06-09 09:26:34', 0); INSERT INTO `sys_role_menu` VALUES (27, 2, 7, '2022-06-09 09:26:34', '2022-06-09 09:26:34', 0); INSERT INTO `sys_role_menu` VALUES (28, 2, 8, '2022-06-09 09:26:34', '2022-06-09 09:26:34', 0); INSERT INTO `sys_role_menu` VALUES (29, 2, 5, '2022-06-09 09:26:34', '2022-06-09 09:26:34', 0); INSERT INTO `sys_role_menu` VALUES (30, 2, 14, '2022-06-09 09:26:34', '2022-06-09 09:26:34', 0); INSERT INTO `sys_role_menu` VALUES (31, 2, 20, '2022-06-09 09:26:34', '2022-06-09 09:26:34', 0); INSERT INTO `sys_role_menu` VALUES (32, 2, 21, '2022-06-09 09:26:34', '2022-06-09 09:26:34', 0); -- ---------------------------- -- Table structure for sys_user -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '会员id', `username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户名', `password` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '密码', `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机', `head_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像地址', `dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门id', `post_id` bigint(20) NULL DEFAULT NULL COMMENT '岗位id', `open_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信openId', `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述', `status` tinyint(3) NULL DEFAULT NULL COMMENT '状态(1:正常 0:停用)', `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', `is_deleted` tinyint(3) NOT NULL DEFAULT 0 COMMENT '删除标记(0:不可用 1:可用)', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `idx_username`(`username`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_user -- ---------------------------- INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$tOaMyJ57yrW606Mc8IZ/eON1Ugf.h7rqR.FnzZMhOjezer8ifXgGC', 'admin', '15000000000', 'http://r61cnlsfq.hn-bkt.clouddn.com/7daa4595-dfde-45da-8513-c5c2b81d20cc', 1022, NULL, '', NULL, 1, '2021-05-31 18:08:43', '2024-04-15 15:42:44', 0);-- ---------------------------- -- Table structure for sys_user_role -- ---------------------------- DROP TABLE IF EXISTS `sys_user_role`; CREATE TABLE `sys_user_role` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id', `role_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '角色id', `user_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户id', `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间', `is_deleted` tinyint(3) NOT NULL DEFAULT 0 COMMENT '删除标记(0:不可用 1:可用)', PRIMARY KEY (`id`) USING BTREE, INDEX `idx_role_id`(`role_id`) USING BTREE, INDEX `idx_admin_id`(`user_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户角色' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of sys_user_role -- ---------------------------- INSERT INTO `sys_user_role` VALUES (2, 2, 2, '2022-01-20 20:49:37', '2022-02-24 10:43:07', 0); INSERT INTO `sys_user_role` VALUES (3, 1, 1, '2022-05-19 10:37:27', '2022-05-24 16:55:53', 1); INSERT INTO `sys_user_role` VALUES (4, 2, 1, '2022-05-19 10:37:27', '2022-05-24 16:55:53', 1); INSERT INTO `sys_user_role` VALUES (5, 1, 1, '2022-05-24 16:55:53', '2022-05-24 16:55:53', 0); INSERT INTO `sys_user_role` VALUES (6, 2, 3, '2022-05-25 16:09:31', '2022-05-25 16:09:31', 0); INSERT INTO `sys_user_role` VALUES (7, 2, 4, '2022-06-02 11:08:14', '2022-06-02 11:15:36', 1); INSERT INTO `sys_user_role` VALUES (8, 2, 4, '2022-06-02 11:15:36', '2022-06-02 16:10:53', 1); INSERT INTO `sys_user_role` VALUES (9, 1, 4, '2022-06-02 11:15:36', '2022-06-02 16:10:53', 1); INSERT INTO `sys_user_role` VALUES (10, 1, 4, '2022-06-02 16:10:53', '2022-06-02 16:10:53', 0); SET FOREIGN_KEY_CHECKS = 1;
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath/> </parent> <groupId>com.atguigu</groupId> <artifactId>newversion-springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.4.1</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--swagger测试--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.21</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
2、编写application.yml 配置文件
server: port: 6666 spring: application: name: boot3-security datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/security-demo username: root password: 123456 data: redis: host: 106.54.26.206 port: 6379 mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3、编写启动类
@SpringBootApplication public class NewVersionApplication { public static void main(String[] args) { SpringApplication.run(NewVersionApplication.class, args); } }
4、准备工具类、通用类
package com.atguigu.newversion.utils; import io.jsonwebtoken.*; import org.springframework.util.StringUtils; import java.util.Date; public class JwtHelper { // token 令牌的过期时间 private static long tokenExpiration = 365 * 24 * 60 * 60 * 1000; // 令牌密钥 private static String tokenSignKey = "123456"; public static String createToken(Long userId, String username) { String token = Jwts.builder() .setSubject("AUTH-USER") .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)) .claim("userId", userId) .claim("username", username) .signWith(SignatureAlgorithm.HS512, tokenSignKey) .compressWith(CompressionCodecs.GZIP) .compact(); return token; } public static Long getUserId(String token) { try { if (StringUtils.isEmpty(token)) return null; Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); Claims claims = claimsJws.getBody(); Integer userId = (Integer) claims.get("userId"); return userId.longValue(); } catch (Exception e) { e.printStackTrace(); return null; } } public static String getUsername(String token) { try { if (StringUtils.isEmpty(token)) return ""; Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); Claims claims = claimsJws.getBody(); return (String) claims.get("username"); } catch (Exception e) { e.printStackTrace(); return null; } } public static void main(String[] args) { String token = JwtHelper.createToken(1L, "admin"); System.out.println(token); System.out.println(JwtHelper.getUserId(token)); System.out.println(JwtHelper.getUsername(token)); } }
package com.atguigu.newversion.utils; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import java.io.IOException; import java.util.Map; public class ResponseUtil { public static void out(HttpServletResponse response, Object result) { ObjectMapper mapper = new ObjectMapper(); response.setStatus(HttpStatus.OK.value()); response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); try { mapper.writeValue(response.getWriter(), result); } catch (IOException e) { e.printStackTrace(); } } }
package com.atguigu.newversion.utils; import lombok.Data; public enum ResultCodeEnum { SUCCESS(200, "请求成功"), FAILED(500, "操作失败"), TOKEN_FAILED(501, "操作超时"), NO_PERMISSION(403, "无权限"), LOGOUT(502, "已退出"), SAFE_CHECK_FAILED(503, "此操作需要先进行安全验证"), NONE(100, "无"); private int code; private String msg; private ResultCodeEnum(int code, String msg) { this.code = code; this.msg = msg; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
package com.atguigu.newversion.utils; import lombok.Data; import java.io.Serializable; @Data public class ResultData<T> implements Serializable { private int code; private String msg; private T data; public static <T> ResultData<T> success(){ ResultData<T> resultData=new ResultData<T>(); resultData.setMsg("操作成功"); resultData.setCode(ResultCodeEnum.SUCCESS.getCode()); return resultData; } public static <T> ResultData<T> success(T data){ ResultData<T> resultData=new ResultData<T>(); resultData.setData(data); resultData.setMsg("操作成功"); resultData.setCode(ResultCodeEnum.SUCCESS.getCode()); return resultData; } public static <T> ResultData<T> success(String msg, T data){ ResultData<T> resultData=new ResultData<T>(); resultData.setData(data); resultData.setMsg(msg); resultData.setCode(ResultCodeEnum.SUCCESS.getCode()); return resultData; } public static <T> ResultData<T> error() { ResultData<T> resultData = new ResultData<>(); resultData.setCode(ResultCodeEnum.FAILED.getCode()); resultData.setMsg("系统异常"); return resultData; } public static <T> ResultData<T> error(String msg) { ResultData<T> resultData = new ResultData<>(); resultData.setCode(ResultCodeEnum.FAILED.getCode()); resultData.setMsg(msg); return resultData; } }
5、添加 实体类
package com.atguigu.newversion.entity.base; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import lombok.Data; import java.io.Serializable; import java.util.Date; import java.util.HashMap; import java.util.Map; @Data public class BaseEntity implements Serializable { @TableId(type = IdType.AUTO) private Long id; @TableField("create_time") private Date createTime; @TableField("update_time") private Date updateTime; @TableLogic @TableField("is_deleted") private Integer isDeleted; @TableField(exist = false) private Map<String,Object> param = new HashMap<>(); }
package com.atguigu.newversion.entity; import com.atguigu.newversion.entity.base.BaseEntity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.util.List; @Data @TableName("sys_user") public class SysUser extends BaseEntity { private static final long serialVersionUID = 1L; @TableField("username") private String username; @TableField("password") private String password; @TableField("name") private String name; @TableField("phone") private String phone; @TableField("head_url") private String headUrl; @TableField("dept_id") private Long deptId; @TableField("post_id") private Long postId; @TableField("description") private String description; @TableField("open_id") private String openId; @TableField("status") private Integer status; @TableField(exist = false) private List<SysRole> roleList; //岗位 @TableField(exist = false) private String postName; //部门 @TableField(exist = false) private String deptName; }
@Data @TableName("sys_role") public class SysRole extends BaseEntity { private static final long serialVersionUID = 1L; @TableField("role_name") private String roleName; @TableField("role_code") private String roleCode; @TableField("description") private String description; }
@Data @TableName("sys_menu") public class SysMenu extends BaseEntity { private static final long serialVersionUID = 1L; @TableField("parent_id") private Long parentId; @TableField("name") private String name; @TableField("type") private Integer type; @TableField("path") private String path; @TableField("component") private String component; @TableField("perms") private String perms; @TableField("icon") private String icon; @TableField("sort_value") private Integer sortValue; @TableField("status") private Integer status; // 下级列表 @TableField(exist = false) private List<SysMenu> children; //是否选中 @TableField(exist = false) private boolean isSelect; }
@Data @TableName("sys_role_menu") public class SysRoleMenu extends BaseEntity { private static final long serialVersionUID = 1L; @TableField("role_id") private Long roleId; @TableField("menu_id") private Long menuId; }
@Data @TableName("sys_user_role") public class SysUserRole extends BaseEntity { private static final long serialVersionUID = 1L; @TableField("role_id") private Long roleId; @TableField("user_id") private Long userId; }
6、编写一个继承 SpringSecurity里的User类 用于封装数据 MySecurityUser类
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.User; import java.util.Collection; public class MySecurityUser extends User { /** * 我们自己的用户实体对象,要调取用户信息时直接获取这个实体对象。(这里我就不写get/set方法了) */ private SysUser sysUser; public MySecurityUser(SysUser sysUser, Collection<? extends GrantedAuthority> authorities) { super(sysUser.getUsername(), sysUser.getPassword(), authorities); this.sysUser = sysUser; } public SysUser getSysUser() { return sysUser; } public void setSysUser(SysUser sysUser) { this.sysUser = sysUser; } }
7、编写一个继承Security 中的 UserDetailService接口 MyUserDetailService 用于查询用户信息和权限权限
@Service public class MyUserDetailsService implements UserDetailsService { @Resource SysUserMapper sysUserMapper; @Resource private SysMenuService sysMenuService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SysUser::getUsername,username); SysUser sysUser = sysUserMapper.selectOne(wrapper); List<String> userPermsList = sysMenuService.findUserPermsList(sysUser.getId()); List<SimpleGrantedAuthority> authorities = new ArrayList<>(); for (String perm : userPermsList) { authorities.add(new SimpleGrantedAuthority(perm.trim())); } return new MySecurityUser(sysUser, authorities); } }
8、编写一个 处理登入请求的过滤器
public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter { private RedisTemplate<String,Object> redisTemplate; public TokenLoginFilter(AuthenticationManager authenticationManager, RedisTemplate redisTemplate) { this.setAuthenticationManager(authenticationManager); this.setPostOnly(false); //指定登录接口及提交方式,可以指定任意路径 this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/user/login","POST")); this.redisTemplate = redisTemplate; } @Override public Authentication attemptAuthentication(HttpServletRequest req, HttpServletResponse res) throws AuthenticationException { try { Map loginVo = new ObjectMapper().readValue(req.getInputStream(), Map.class); //这个方法让Security 去调用 UserDetailsService loadUserByUsername方法 Authentication authenticationToken = new UsernamePasswordAuthenticationToken(loginVo.get("username"), loginVo.get("password")); return this.getAuthenticationManager().authenticate(authenticationToken); } catch (IOException e) { throw new RuntimeException(e); } } /** * 登录成功 * @param request * @param response * @param chain * @param auth * @throws IOException * @throws ServletException */ @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication auth) throws IOException, ServletException { System.out.println("《==========================登入成功=========================》"); MySecurityUser customUser = (MySecurityUser) auth.getPrincipal(); String token = JwtHelper.createToken(customUser.getSysUser().getId(), customUser.getSysUser().getUsername()); //保存权限数据 redisTemplate.opsForValue().set(customUser.getUsername(), JSON.toJSONString(customUser.getAuthorities())); //通过response返回数据 ResponseUtil.out(response, ResultData.success(token)); } /** * 登录失败 * @param request * @param response * @param e * @throws IOException * @throws ServletException */ @Override protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException { System.out.println("《==========================登入失败=========================》"); if(e.getCause() instanceof RuntimeException) { ResponseUtil.out(response, ResultData.error(e.getMessage())); } else { ResponseUtil.out(response, ResultData.error("登入失败用户名或密码错误")); } } }
9、编写一个过滤所有方法的过滤器获取token 校验用户是否登入
public class TokenAuthenticationFilter extends OncePerRequestFilter { private RedisTemplate redisTemplate; public TokenAuthenticationFilter(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { logger.info("uri:"+request.getRequestURI()); //如果是登录接口,直接放行 if("/user/login".equals(request.getRequestURI())) { chain.doFilter(request, response); return; } UsernamePasswordAuthenticationToken authentication = getAuthentication(request,response); if(null != authentication) { //最终把用户的所以信息放到安全 上下文对象里面 在项目任何地方使用 SecurityContextHolder.getContext().setAuthentication(authentication); chain.doFilter(request, response); } else { Map<String, Object> map = new HashMap<>(); map.put("msg", "没有登入请先登入"); //通过response返回数据 ResponseUtil.out(response, map); } } private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request,HttpServletResponse response) { String token = request.getHeader("token"); if (!StringUtils.isEmpty(token)) { String username = JwtHelper.getUsername(token); Long userId = JwtHelper.getUserId(token); if (!StringUtils.isEmpty(username)) { String authoritiesString = (String) redisTemplate.opsForValue().get(username); if(authoritiesString == null){ ResponseUtil.out(response, ResultData.error("令牌已经失效请重新登入")); } List<Map> mapList = JSON.parseArray(authoritiesString, Map.class); List<SimpleGrantedAuthority> authorities = new ArrayList<>(); for (Map map : mapList) { authorities.add(new SimpleGrantedAuthority((String)map.get("authority"))); } return new UsernamePasswordAuthenticationToken(username, userId, authorities); } else { return new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()); } } return null; } }
10、编写redis的配置类
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 设置key的序列化方式为StringRedisSerializer template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); // 设置value的序列化方式,根据需要选择合适的序列化器 template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } @Bean public CacheManager cacheManager(LettuceConnectionFactory connectionFactory) { //定义序列化器 GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() //过期时间600秒 .entryTtl(Duration.ofSeconds(600)) // 配置序列化 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)); RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory) .cacheDefaults(config) .build(); return cacheManager; } }
11、SpringSevurity的核心配置类
@EnableMethodSecurity @EnableWebSecurity//@EnableWebSecurity是开启SpringSecurity的默认行为 @Configuration public class MyWebSecurityConfig { @Autowired private MyUserDetailsService myUserDetailsService; @Autowired private RedisTemplate<String,Object> redisTemplate; @Bean public AuthenticationManager authenticationManager(){ DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); provider.setUserDetailsService(myUserDetailsService); provider.setPasswordEncoder(passwordEncoder()); ProviderManager providerManager = new ProviderManager(provider); return providerManager; } //密码加密器 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http.authorizeHttpRequests(conf ->conf.requestMatchers(paths).permitAll() .anyRequest().authenticated()) .csrf(AbstractHttpConfigurer::disable) .sessionManagement(conf ->conf.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .addFilterBefore(new TokenAuthenticationFilter(redisTemplate), UsernamePasswordAuthenticationFilter.class) .addFilter(new TokenLoginFilter(authenticationManager(),redisTemplate)) .build(); } private final String[] paths = { "/favicon.ico","/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**", "/doc.html","/v3/**" }; @Bean WebSecurityCustomizer ignoredUrlsCustomizer() { return (web) -> web.ignoring().requestMatchers(paths); } }
12、根据userID 查询用户拥有的权限数据
<?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.atguigu.newversion.mapper.SysMenuMapper">
<resultMap id="sysMenuMap" type="com.atguigu.newversion.entity.SysMenu" autoMapping="true">
</resultMap>
<select id="findListByUserId" resultMap="sysMenuMap">
select distinct
m.id,m.parent_id,m.name,m.type,m.path,m.component,m.perms,m.icon,m.sort_value,m.status,m.create_time,m.update_time,m.is_deleted
from sys_menu m
inner join sys_role_menu rm on rm.menu_id = m.id
inner join sys_user_role ur on ur.role_id = rm.role_id
where ur.user_id=#{userId}
and m.status = 1
and rm.is_deleted = 0
and ur.is_deleted = 0
and m.is_deleted = 0
</select>
</mapper>

浙公网安备 33010602011771号