如果不清楚RBAC权限模型的可以参考一下连接:
方案实现步骤如下:
一. 基本的权限的数据库表
- 用户表
CREATE TABLE `sys_user` ( `user_id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '用户名', `password` varchar(100) DEFAULT NULL COMMENT '密码', `salt` varchar(20) DEFAULT NULL COMMENT '盐', `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `mobile` varchar(100) DEFAULT NULL COMMENT '手机号', `status` tinyint(4) DEFAULT NULL COMMENT '状态 0:禁用 1:正常', `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者ID', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`user_id`), UNIQUE KEY `username` (`username`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='系统用户';
- 菜单表(权限表)
CREATE TABLE `sys_menu` ( `menu_id` bigint(20) NOT NULL AUTO_INCREMENT, `parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID,一级菜单为0', `name` varchar(50) DEFAULT NULL COMMENT '菜单名称', `url` varchar(200) DEFAULT NULL COMMENT '菜单URL', `perms` varchar(500) DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:user:list,user:create)', `type` int(11) DEFAULT NULL COMMENT '类型 0:目录 1:菜单 2:按钮', `icon` varchar(50) DEFAULT NULL COMMENT '菜单图标', `order_num` int(11) DEFAULT NULL COMMENT '排序', PRIMARY KEY (`menu_id`) ) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COMMENT='菜单管理';
- 角色表
CREATE TABLE `sys_role` ( `role_id` bigint(20) NOT NULL AUTO_INCREMENT, `role_name` varchar(100) DEFAULT NULL COMMENT '角色名称', `remark` varchar(100) DEFAULT NULL COMMENT '备注', `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者ID', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`role_id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='角色';
- 角色和菜单关联表
CREATE TABLE `sys_role_menu` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID', `menu_id` bigint(20) DEFAULT NULL COMMENT '菜单ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COMMENT='角色与菜单对应关系';
- 用户和角色关联表
CREATE TABLE `sys_user_role` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID', `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='用户与角色对应关系';
二. 一些主要代码
大体思路,需要维护两个主要关系,用户和角色,角色和权限 ,当用户登录认证成功以后需要连表查询出当前登录用户所能查看的所有菜单和拥有的权限,并返回前端。当前端访问带@RequiresPermissions 注解的接口时也需要连表查询当前用户是否有访问当前方法的权限。当修改用户拥有的角色的时候需要将之前把 sys_user_role 表中之前保存的有关这个用户的数据删除掉,再重新保存。修改某一个角色拥有的权限的时候也是同样的道理。
具体的代码可以参考一下连接:
https://github.com/Dr-Water/ratel-fast
主要代码是如图红框所示的类:
关于springboot和shiro的整合,以及验证码相关的分析可以参考一下连接: