springboot mybatisPlus整合shiro實現許可權控制
阿新 • • 發佈:2021-06-23
1.建立資料庫表。由於時間倉促,資料庫表設計不太合理,後期會更改
/* Navicat Premium Data Transfer Source Server : 本地 Source Server Type : MySQL Source Server Version : 80021 Source Host : localhost:3306 Source Schema : logindatabase Target Server Type : MySQL Target Server Version : 80021 File Encoding : 65001 Date: 23/06/2021 15:25:59 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for sys_menu -- ---------------------------- DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE `sys_menu` ( `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `menu_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '選單名稱', `permission_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '許可權ID', `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '請求路徑', `sort` tinyint(0) NULL DEFAULT NULL COMMENT '排序', `style` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '樣式(可設定css圖示)', `parent_id` int(0) NULL DEFAULT NULL COMMENT '父主鍵ID(有值的,屬於該值選單的下級選單)', `create_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '建立人', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間', `update_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改時間', `is_deleted` tinyint(0) UNSIGNED NULL DEFAULT 0 COMMENT '是否刪除(0:正常/1:刪除)', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '選單表' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of sys_menu -- ---------------------------- INSERT INTO `sys_menu` VALUES (1, '系統管理', '10001', NULL, 1, NULL, NULL, '88888888', '2021-03-23 15:09:11', NULL, NULL, 0); INSERT INTO `sys_menu` VALUES (2, '許可權管理', '10002', '/sys/permission', 2, NULL, 1, '88888888', '2021-03-23 15:09:11', NULL, NULL, 0); INSERT INTO `sys_menu` VALUES (3, '角色管理', '10003', '/sys/role', 3, NULL, 1, '88888888', '2021-03-23 15:09:11', NULL, NULL, 0); INSERT INTO `sys_menu` VALUES (4, '使用者管理', '10004', '/sys/user', 4, NULL, 1, '88888888', '2021-03-23 15:09:11', NULL, NULL, 0); -- ---------------------------- -- Table structure for sys_permission -- ---------------------------- DROP TABLE IF EXISTS `sys_permission`; CREATE TABLE `sys_permission` ( `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `permission_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '許可權編碼', `permission_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '許可權名稱', `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '描述說明', `create_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '建立人', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間', `update_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改時間', `is_deleted` tinyint(0) UNSIGNED NULL DEFAULT 0 COMMENT '是否刪除(0:正常/1:刪除)', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '許可權表' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of sys_permission -- ---------------------------- INSERT INTO `sys_permission` VALUES (1, 'sys:controller', '系統管理', '選單許可權(一級選單)', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (2, 'per:controller', '許可權管理', '選單許可權(二級選單)', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (3, 'role:controller', '角色管理', '選單許可權(二級選單)', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (4, 'user:controller', '使用者管理', '選單許可權(二級選單)', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (5, 'admin', '超級管理員', '當用戶角色擁有該許可權時,可分配sys_role表中許可權ID為該值的角色給使用者', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (6, 'group', '組長管理員', '組長角色擁有該許可權時,可分配測試員的角色給使用者', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (7, 'list:view', '查詢許可權列表', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (8, 'per:add', '新增許可權', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (9, 'per:edit', '修改許可權', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (10, 'per:delete', '刪除許可權', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (11, 'role:view', '查詢角色列表', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (12, 'role:add', '新增角色', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (13, 'role:edit', '修改角色', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (14, 'role:delete', '刪除角色', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (15, 'user:list', '查詢使用者列表', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (16, 'user:add', '新增使用者', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (17, 'user:edit', '修改使用者', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); INSERT INTO `sys_permission` VALUES (18, 'user:delete', '刪除使用者', '介面許可權', '88888888', '2021-03-23 15:11:42', NULL, NULL, 0); -- ---------------------------- -- Table structure for sys_role -- ---------------------------- DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `role_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色code', `role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色名稱', `create_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '建立人', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間', `update_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改時間', `is_deleted` tinyint(1) NULL DEFAULT 0 COMMENT '是否刪除(0:正常/1:刪除)', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色表' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of sys_role -- ---------------------------- INSERT INTO `sys_role` VALUES (1, 'admin', '超級管理員', '88888888', '2021-03-23 15:18:10', NULL, NULL, 0); INSERT INTO `sys_role` VALUES (2, 'group', '組長', '88888888', '2021-03-23 15:18:10', NULL, NULL, 0); INSERT INTO `sys_role` VALUES (3, 'test', '測試員', '88888888', '2021-03-23 15:18:10', NULL, NULL, 0); -- ---------------------------- -- Table structure for sys_role_permission -- ---------------------------- DROP TABLE IF EXISTS `sys_role_permission`; CREATE TABLE `sys_role_permission` ( `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `role_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色ID', `permission_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '許可權ID', `create_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '建立人', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間', `update_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改時間', `is_deleted` tinyint(1) NULL DEFAULT 0 COMMENT '是否刪除(0:正常/1:刪除)', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色許可權關聯表' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of sys_role_permission -- ---------------------------- INSERT INTO `sys_role_permission` VALUES (1, '1', '1', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (2, '2', '2', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (3, '3', '3', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (4, '1', '4', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (5, '1', '5', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (6, '1', '6', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (7, '2', '7', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (8, '2', '8', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (9, '2', '9', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (10, '3', '10', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (11, '3', '11', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (12, '3', '12', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (13, '1', '13', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (14, '1', '14', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (15, '1', '15', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (16, '2', '16', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (17, '1', '17', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (18, '1', '18', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (19, '2', '13', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (20, '2', '14', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (21, '2', '15', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (22, '2', '10', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (23, '3', '11', '1', '2021-03-23 15:29:09', NULL, NULL, 0); INSERT INTO `sys_role_permission` VALUES (24, '3', '12', '1', '2021-03-23 15:29:09', NULL, NULL, 0); -- ---------------------------- -- Table structure for sys_user -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `user_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '使用者名稱稱', `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密碼', `create_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '建立人', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間', `update_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改時間', `is_deleted` tinyint(1) NULL DEFAULT 0 COMMENT '是否刪除(0:正常/1:刪除)', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '使用者表' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of sys_user -- ---------------------------- INSERT INTO `sys_user` VALUES (1, '超級管理員', '88888888', '88888888', '2021-03-23 15:51:27', NULL, NULL, 0); INSERT INTO `sys_user` VALUES (2, '張三', '123456', '88888888', '2021-03-23 15:51:27', NULL, NULL, 0); INSERT INTO `sys_user` VALUES (3, '李四', '123456', '88888888', '2021-03-23 15:51:27', NULL, NULL, 0); INSERT INTO `sys_user` VALUES (4, '王五', '123456', '88888888', '2021-03-23 15:51:27', NULL, NULL, 0); -- ---------------------------- -- Table structure for sys_user_role -- ---------------------------- DROP TABLE IF EXISTS `sys_user_role`; CREATE TABLE `sys_user_role` ( `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '使用者ID', `role_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '角色ID', `create_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '建立人', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '建立時間', `update_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '修改人', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改時間', `is_deleted` tinyint(1) NULL DEFAULT 0 COMMENT '是否刪除(0:正常/1:刪除)', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '使用者角色關聯表' ROW_FORMAT = DYNAMIC; -- ---------------------------- -- Records of sys_user_role -- ---------------------------- INSERT INTO `sys_user_role` VALUES (1, '1', '1', '1', '2021-03-23 15:54:17', NULL, NULL, 0); INSERT INTO `sys_user_role` VALUES (2, '2', '2', '1', '2021-03-23 15:54:17', NULL, NULL, 0); INSERT INTO `sys_user_role` VALUES (3, '3', '3', '1', '2021-03-23 15:54:17', NULL, NULL, 0); INSERT INTO `sys_user_role` VALUES (4, '4', '1', '1', '2021-03-23 15:54:17', NULL, NULL, 0); INSERT INTO `sys_user_role` VALUES (5, '4', '2', '1', '2021-03-23 15:54:17', NULL, NULL, 0); INSERT INTO `sys_user_role` VALUES (6, '1', '3', '1', '2021-03-23 15:54:17', NULL, NULL, 0); INSERT INTO `sys_user_role` VALUES (7, '1', '2', '1', '2021-03-23 15:54:17', NULL, NULL, 0); SET FOREIGN_KEY_CHECKS = 1;
2.pom檔案
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- shiro start --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.3.2</version> </dependency> <!-- shiro end --> <!-- mysql start --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- mysql end --> <!-- mybatis-plus start --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.2.0</version> </dependency> <!-- mybatis-plus end --> <!-- mybatis-plus程式碼生成 start --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.2.0</version> </dependency> <!-- mybatis-plus程式碼生成 end --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</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>
3.程式碼生成(網上找的別人的)
public class GeneratorCodeConfig { public static String scanner(String tip) { Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append("請輸入" + tip + ":"); System.out.println(help.toString()); if (scanner.hasNext()) { String ipt = scanner.next(); if (StringUtils.isNotEmpty(ipt)) { return ipt; } } throw new MybatisPlusException("請輸入正確的" + tip + "!"); } public static void main(String[] args) { // 程式碼生成器 AutoGenerator mpg = new AutoGenerator(); // 全域性配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); gc.setAuthor("zk"); gc.setOpen(false); //實體屬性 Swagger2 註解 gc.setSwagger2(false); mpg.setGlobalConfig(gc); // 資料來源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://127.0.0.1:3306/logindatabase?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("root1234"); mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); // pc.setModuleName(scanner("模組名")); pc.setParent("com.example"); pc.setEntity("model"); pc.setMapper("mapper"); pc.setService("service"); pc.setServiceImpl("service.impl"); mpg.setPackageInfo(pc); // 自定義配置 // InjectionConfig cfg = new InjectionConfig() { // @Override // public void initMap() { // // to do nothing // } // }; // 如果模板引擎是 freemarker // String templatePath = "/templates/mapper.xml.ftl"; // 如果模板引擎是 velocity // String templatePath = "/templates/mapper.xml.vm"; // 自定義輸出配置 // List<FileOutConfig> focList = new ArrayList<>(); // 自定義配置會被優先輸出 // focList.add(new FileOutConfig(templatePath) { // @Override // public String outputFile(TableInfo tableInfo) { // // 自定義輸出檔名 , 如果你 Entity 設定了前後綴、此處注意 xml 的名稱會跟著發生變化!! // return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() // + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; // } // }); /* cfg.setFileCreate(new IFileCreate() { @Override public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { // 判斷自定義資料夾是否需要建立 checkDir("呼叫預設方法建立的目錄"); return false; } }); */ // cfg.setFileOutConfigList(focList); // mpg.setCfg(cfg); // 配置模板 TemplateConfig templateConfig = new TemplateConfig(); // 配置自定義輸出模板 //指定自定義模板路徑,注意不要帶上.ftl/.vm, 會根據使用的模板引擎自動識別 // templateConfig.setEntity("templates/entity2.java"); // templateConfig.setService(); // templateConfig.setController(); templateConfig.setXml(null); mpg.setTemplate(templateConfig); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setSuperEntityClass("com.baomidou.mybatisplus.extension.activerecord.Model"); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true); strategy.setEntityLombokModel(true); // 公共父類 // strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController"); // 寫於父類中的公共欄位 // strategy.setSuperEntityColumns("id"); strategy.setInclude(scanner("表名,多個英文逗號分割").split(",")); strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(pc.getModuleName() + "_"); mpg.setStrategy(strategy); mpg.setTemplateEngine(new FreemarkerTemplateEngine()); mpg.execute(); }
4.mybatis分頁外掛
@Configuration
public class MybatisPlusConfig {
/**
* 分頁外掛
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
5.新增shiro配置類
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 必須設定 SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
// setLoginUrl 如果不設定值,預設會自動尋找Web工程根目錄下的"/login.jsp"頁面 或 "/login" 對映
shiroFilterFactoryBean.setLoginUrl("/notLogin");
// 設定無許可權時跳轉的 url;
shiroFilterFactoryBean.setUnauthorizedUrl("/notRole");
// 設定攔截器
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
//開放登陸介面
filterChainDefinitionMap.put("/login", "anon");
//其餘介面一律攔截
//主要這行程式碼必須放在所有許可權設定的最後,不然會導致所有 url 都被攔截
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
System.out.println("Shiro攔截器工廠類注入成功");
return shiroFilterFactoryBean;
}
/**
* 注入 securityManager
*/
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 設定realm.
securityManager.setRealm(customRealm());
return securityManager;
}
/**
* 自定義身份認證 realm;
* <p>
* 必須寫這個類,並加上 @Bean 註解,目的是注入 CustomRealm,
* 否則會影響 CustomRealm類 中其他類的依賴注入
*/
@Bean
public CustomRealm customRealm() {
return new CustomRealm();
}
/**
* 開啟Shiro的註解(如@RequiresRoles,@RequiresPermissions)
* @return
*/
@Bean
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
/**
* 開啟aop註解支援
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
}
6.建立CustomRealm用於使用者驗證和許可權控制
public class CustomRealm extends AuthorizingRealm {
@Autowired
private ISysUserService userService;
@Autowired
private ISysPermissionService sysPermissionService;
/**
* 獲取身份驗證資訊
* Shiro中,最終是通過 Realm 來獲取應用程式中的使用者、角色及許可權資訊的。
*
* @param authenticationToken 使用者身份資訊 token
* @return 返回封裝了使用者資訊的 AuthenticationInfo 例項
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("————身份認證方法————");
String password = "";
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
// 從資料庫獲取對應使用者名稱密碼的使用者
QueryWrapper query = new QueryWrapper();
query.eq("user_name",token.getUsername());
SysUser user = userService.getOne(query);
if (user != null){
password = user.getPassword();
if (null == password) {
throw new AccountException("使用者名稱不正確");
} else if (!password.equals(new String((char[]) token.getCredentials()))) {
throw new AccountException("密碼不正確");
}
}else {
throw new AccountException("該使用者不存在");
}
// 第一個引數儲存為當前登陸人資訊就可以使用 SecurityUtils.getSubject().getPrincipal() 獲取登陸人資訊
return new SimpleAuthenticationInfo(user, password, getName());
}
/**
* 獲取授權資訊
*
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("————許可權認證————");
String username = (String) SecurityUtils.getSubject().getPrincipal();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//獲得該使用者角色
Set<SysRole> sets = userService.getRole(username);
Set<String> set = sets.stream().map(SysRole::getRoleCode).collect(Collectors.toSet());
Set<Integer> roleIds = sets.stream().map(SysRole::getId).collect(Collectors.toSet());
//設定該使用者擁有的角色
info.setRoles(set);
Set<String> permissionSet = sysPermissionService.getPermissionByRole(roleIds);
info.setStringPermissions(permissionSet);
return info;
}
}
7.service
ISysUserService
public interface ISysUserService extends IService<SysUser> {
Set<SysRole> getRole(String username);
}
ISysPermissionService
public interface ISysPermissionService extends IService<SysPermission> {
Set<String> getPermissionByRole(Set<Integer> sets);
}
8.serviceImpl
ISysUserServiceImpl
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
@Autowired
private SysUserMapper userMapper;
@Override
public Set<SysRole> getRole(String username) {
return userMapper.getRole(username);
}
}
ISysPermissionServiceImpl
@Service
public class SysPermissionServiceImpl extends ServiceImpl<SysPermissionMapper, SysPermission> implements ISysPermissionService {
@Autowired
private SysPermissionMapper sysPermissionMapper;
@Override
public Set<String> getPermissionByRole(Set<Integer> sets) {
return sysPermissionMapper.getPermissionByRole(sets);
}
}
9.mapper
ISysUserMapper
@Repository
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {
Set<SysRole> getRole(String username);
}
ISysPermissionMapper
@Repository
@Mapper
public interface SysPermissionMapper extends BaseMapper<SysPermission> {
Set<String> getPermissionByRole(@Param("set") Set<Integer> sets);
}
10.mapper.xml
SysUserMapper
<?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.example.mapper.SysUserMapper">
<select id="getRole" resultType="com.example.model.SysRole">
SELECT r.* FROM `sys_user_role` AS ur JOIN sys_role AS r ON ur.role_id = r.id WHERE ur.user_id = (SELECT id FROM sys_user WHERE user_name = #{username})
</select>
</mapper>
SysPermissionMapper
<?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.example.mapper.SysPermissionMapper">
<select id="getPermissionByRole" parameterType="java.util.Set" resultType="string">
SELECT
permission_code AS permissionCode
FROM
sys_permission
WHERE
id IN (
SELECT
permission_id
FROM
`sys_role_permission`
WHERE
<choose>
<when test="set !=null and set.size()>0">
role_id in
<foreach item="id" index="index" collection="set" open="(" separator="," close=")">
#{id}
</foreach>
</when>
<otherwise>
0 = 1
</otherwise>
</choose>
)
</select>
</mapper>
11.yml
server:
port: 8081
servlet:
context-path: /
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/logindatabase?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root1234
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
auto-mapping-behavior: full
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath*:mapping/*Mapper.xml
global-config:
db-config:
logic-not-delete-value: 1
logic-delete-value: 0
12.編寫登入controller
package com.example.controller;
import com.example.result.ResultInfo;
import com.example.result.Status;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @author zk
* @Classname LoginController
* @Description TODO
* @Date 2021/6/11 17:17
*/
@RestController
public class LoginController {
@RequestMapping(value = "/notLogin", method = RequestMethod.GET)
public ResultInfo notLogin() {
return new ResultInfo(Status.SUCCESS.code,"您尚未登陸!");
}
@RequestMapping(value = "/notRole", method = RequestMethod.GET)
public ResultInfo notRole() {
return new ResultInfo(Status.SUCCESS.code,"您沒有許可權!");
}
@RequestMapping(value = "/logout", method = RequestMethod.GET)
public ResultInfo logout() {
Subject subject = SecurityUtils.getSubject();
//登出
subject.logout();
return new ResultInfo(Status.SUCCESS.code,"成功登出!");
}
/**
* 登陸
*
* @param username 使用者名稱
* @param password 密碼
*/
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResultInfo login(String username, String password) {
// 從SecurityUtils裡邊建立一個 subject
Subject subject = SecurityUtils.getSubject();
// 在認證提交前準備 token(令牌)
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
// 執行認證登陸
subject.login(token);
return new ResultInfo(Status.SUCCESS.code,"登入成功");
}
}
13.編寫異常處理ExceptionController
package com.example.controller;
import com.example.result.ResultInfo;
import com.example.result.Status;
import org.apache.shiro.authc.AccountException;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @author zk
* @Classname ExceptionController
* @Description TODO
* @Date 2021/6/11 17:14
*/
@RestControllerAdvice
public class ExceptionController {
@Autowired
private ResultInfo resultInfo;
@Autowired
public ExceptionController(ResultInfo resultMap) {
this.resultInfo = resultMap;
}
// 捕捉 CustomRealm 丟擲的異常
@ExceptionHandler(AccountException.class)
public ResultInfo handleShiroException(Exception ex) {
return new ResultInfo(Status.SYSTEM_ERROR.code,ex.getMessage());
}
/**
* 訪問介面沒有許可權
* @param e
* @return
*/
@ExceptionHandler(UnauthorizedException.class)
public ResultInfo handleShiroException1(Exception e) {
return new ResultInfo(Status.INSUFFICIENT_PERMISSION.code,e.getMessage()+"---"+Status.INSUFFICIENT_PERMISSION.message);
}
}
14.返回結果封裝類以及返回碼列舉類
package com.example.result;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.io.Serializable;
/**
* @author zk
* @Classname ResultInfo
* @Description 返回引數格式封裝類
* @Date 2021/6/11 11:28
*/
@Data
@Component
public class ResultInfo implements Serializable {
// 狀態碼
private Integer code;
// 訊息
private String message;
// 資料物件
private Object result;
/**
* 無參構造器
*/
public ResultInfo() {
super();
}
public ResultInfo(Status status) {
super();
this.code = status.code;
this.message = status.message;
}
public ResultInfo result(Object result) {
this.result = result;
return this;
}
public ResultInfo message(String message) {
this.message = message;
return this;
}
/**
* 只返回狀態,狀態碼,訊息
*
* @param code
* @param message
*/
public ResultInfo(Integer code, String message) {
super();
this.code = code;
this.message = message;
}
/**
* 只返回狀態,狀態碼,資料物件
*
* @param code
* @param result
*/
public ResultInfo(Integer code, Object result) {
super();
this.code = code;
this.result = result;
}
/**
* 返回全部資訊即狀態,狀態碼,訊息,資料物件
*
* @param code
* @param message
* @param result
*/
public ResultInfo(Integer code, String message, Object result) {
super();
this.code = code;
this.message = message;
this.result = result;
}
}
package com.example.result;
/**
* @author zk
* @Classname Status
* @Description 返回值狀態
* @Date 2021/6/11 11:29
*/
public enum Status {
// 公共
SUCCESS(2000, "成功"),
UNKNOWN_ERROR(9998,"未知異常"),
SYSTEM_ERROR(9999, "系統異常"),
INSUFFICIENT_PERMISSION(4003, "許可權不足"),
WARN(9000, "失敗"),
REQUEST_PARAMETER_ERROR(1002, "請求引數錯誤"),
// 登入
LOGIN_EXPIRE(2001, "未登入或者登入失效"),
LOGIN_CODE_ERROR(2002, "登入驗證碼錯誤"),
LOGIN_ERROR(2003, "使用者名稱不存在或密碼錯誤"),
LOGIN_USER_STATUS_ERROR(2004, "使用者狀態不正確"),
LOGOUT_ERROR(2005, "退出失敗,token不存在"),
LOGIN_USER_NOT_EXIST(2006, "該使用者不存在"),
LOGIN_USER_EXIST(2007, "該使用者已存在");
public int code;
public String message;
Status(int code, String message) {
this.code = code;
this.message = message;
}
}
最後附上實體類
package com.example.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 使用者表
* </p>
*
* @author zk
* @since 2021-06-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class SysUser extends Model {
private static final long serialVersionUID = 1L;
/**
* 主鍵
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 使用者名稱稱
*/
private String userName;
/**
* 密碼
*/
private String password;
/**
* 建立人
*/
private String createUser;
/**
* 建立時間
*/
private LocalDateTime createTime;
/**
* 修改人
*/
private String updateUser;
/**
* 修改時間
*/
private LocalDateTime updateTime;
/**
* 是否刪除(0:正常/1:刪除)
*/
private Boolean isDeleted;
}
package com.example.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* <p>
* 許可權表
* </p>
*
* @author zk
* @since 2021-06-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@NoArgsConstructor
public class SysPermission extends Model {
private static final long serialVersionUID = 1L;
/**
* 主鍵
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 許可權code
*/
private String permissionCode;
/**
* 許可權名稱
*/
private String permissionName;
/**
* 描述說明
*/
private String description;
/**
* 建立人
*/
private String createUser;
/**
* 建立時間
*/
private LocalDateTime createTime;
/**
* 修改人
*/
private String updateUser;
/**
* 修改時間
*/
private LocalDateTime updateTime;
/**
* 是否刪除(0:正常/1:刪除)
*/
private Integer isDeleted;
}
剛開始寫部落格,只是用來平時記錄,如果有什麼遺漏或有問題的地方,希望各位大佬指出,謝謝。程式碼已上傳至碼雲,地址https://gitee.com/ObjectKang/shirodemo