前言:
Shiro中本身就提供了sessionManager和sessionDAO,我们可以把shiro和redis集成起来,把session持久化到Redis中,需要使用的时候从Redis中可以获取对应的session。
本章介绍如下几个功能:
1.当用户没有登陆时只能访问登陆界面
2.当用户登陆成功后,只能访问该用户下仅有的权限
3.记住登录用户(rememberMe)
4.一个账号可以多人同时登录
说明:本章案例做了简化,仅作为springboot+shiro+redis项目整合为参考,适合入门使用,亲测有效。
一、数据库设计
表设计思路:用户对应角色,角色包含拥有的菜单和其他权限,菜单也对应着某个权限,说明有这个菜单就有对应的权限(权限表包含菜单ID),权限表里不设置菜单ID就是其他权限。
1.SQL
/* Navicat Premium Data Transfer Source Server : localhost Source Server Type : MySQL Source Server Version : 50712 Source Host : localhost:3306 Source Schema : boot_shiro_redis Target Server Type : MySQL Target Server Version : 50712 File Encoding : 65001 Date: 10/03/2020 17:09:41 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for manage_menu -- ---------------------------- DROP TABLE IF EXISTS `manage_menu`; CREATE TABLE `manage_menu` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '路径名称', `ICON` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '图标class(el)', `URL` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路径地址', `PARENT_ID` int(11) NULL DEFAULT NULL COMMENT '父节点ID,父节点同样在本目录下', PRIMARY KEY (`ID`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单管理表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of manage_menu -- ---------------------------- INSERT INTO `manage_menu` VALUES (1, '首页', 'el-icon-s-home', '/index', NULL); INSERT INTO `manage_menu` VALUES (2, '权限管理', 'fa fa-book', '/managePermission/getPermissionAll', NULL); INSERT INTO `manage_menu` VALUES (3, '人员管理', 'fa fa-book', '/manageUser/getUserAll', 2); -- ---------------------------- -- Table structure for manage_permission -- ---------------------------- DROP TABLE IF EXISTS `manage_permission`; CREATE TABLE `manage_permission` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '权限名称', `RESOURCE` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '资源地址', `SN` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '描述', `MENU_ID` int(11) NULL DEFAULT NULL COMMENT '菜单表中的ID', PRIMARY KEY (`ID`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '路径权限' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of manage_permission -- ---------------------------- INSERT INTO `manage_permission` VALUES (1, '查看所有权限', '/managePermission/getPermissionAll', 'managePermission:list', 3); INSERT INTO `manage_permission` VALUES (2, '查看所有人员', '/manageUser/getUserAll', 'manageUser:list', NULL); -- ---------------------------- -- Table structure for manage_roles -- ---------------------------- DROP TABLE IF EXISTS `manage_roles`; CREATE TABLE `manage_roles` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色名', `MENUS_ID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '菜单的ID(多个菜单由逗号分隔)', `PERMISSIONS_ID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '其余权限的ID(多个权限由逗号分隔)', PRIMARY KEY (`ID`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色权限' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of manage_roles -- ---------------------------- INSERT INTO `manage_roles` VALUES (1, '管理员', '1,2,3', '3'); INSERT INTO `manage_roles` VALUES (2, '普通用户', '1', NULL); -- ---------------------------- -- Table structure for manage_user -- ---------------------------- DROP TABLE IF EXISTS `manage_user`; CREATE TABLE `manage_user` ( `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '管理员ID', `USERNAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登陆名', `PASSWORD` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码', `ROLE_ID` int(11) NOT NULL DEFAULT 0 COMMENT '对应的角色Id', PRIMARY KEY (`ID`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '登录用户' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of manage_user -- ---------------------------- INSERT INTO `manage_user` VALUES (1, 'admin', '4ec847db9bc2bad60e4279cce1fad5db', 1); INSERT INTO `manage_user` VALUES (4, 'user', '4e0374eaa5fd58d90a549cac95a657ab', 2); SET FOREIGN_KEY_CHECKS = 1;