权限管理
在传统项目中,权限管理是很重要、也是比较复杂的一个问题
我之前,就是苦于没有一个完整的教学项目,讲这方面的知识
今天,我就在这里,分享一下,传统的权限管理方法
关于怎么使用 shiro 等框架,实现权限管理,这个我会在以后讲
首先先把传统项目中的权限管理方式搞明白了
数据库分析与创建
数据库表有两种组织形式
我们的讲解,以较为容易的版本1为主
版本1:
这个版本下,一个用户,只对应一个角色,而一个角色,可以包含多个用户,是一个一对多的关系;即用户表中,要有一个列,表示角色
版本2:
一个用户可以有多个角色
是一个多对多的关系
所以,需要三张表
建库语句
这里给出四张表的建库语句,方便大家测试
# 用户表
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`userid` int NOT NULL AUTO_INCREMENT,
`loginname` varchar(10) DEFAULT NULL,
`password` varchar(12) DEFAULT NULL,
`realname` varchar(10) DEFAULT NULL,
`sex` int DEFAULT NULL,
`email` varchar(20) DEFAULT NULL,
`address` varchar(50) DEFAULT NULL,
`phone` varchar(12) DEFAULT NULL,
`cardid` varchar(20) DEFAULT NULL,
`desc` varchar(50) DEFAULT NULL,
# 用户是1方,角色是多方
`roleid` int DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
# 角色表
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`roleid` int NOT NULL AUTO_INCREMENT,
`rolename` varchar(10) DEFAULT NULL,
`rolestate` int DEFAULT NULL COMMENT '0 禁用 1 启用',
PRIMARY KEY (`roleid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 中间表 (角色表和菜单表之间的关系)
DROP TABLE IF EXISTS `middle`;
CREATE TABLE `middle` (
`middleid` int NOT NULL AUTO_INCREMENT,
`roleid` int DEFAULT NULL,
`menuid` int DEFAULT NULL,
PRIMARY KEY (`middleid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
# 菜单表(其实就是用户的权限表)
DROP TABLE IF EXISTS `menu`;
CREATE TABLE `menu` (
`menuid` int NOT NULL AUTO_INCREMENT,
`menuname` varchar(255) DEFAULT NULL comment '菜单名称',
`upmenuid` int DEFAULT NULL comment '上一级菜单的id 如果为0,表示的是 顶级菜单 这个菜单的实现方式,就是无限级数的实现方式',
`state` int DEFAULT NULL comment '菜单状态 1为启用 0为禁用',
`desc` varchar(50) DEFAULT NULL comment '菜单介绍',
`url` varchar(20) DEFAULT NULL,
PRIMARY KEY (`menuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
menu 表:
这里要对 menu 表做个解释,不然可能看的有点模糊
如果看了下面的图,还是不懂,可以去搜一下 无限级数
其中的url:
表示点击这个菜单后,走的请求
这个请求,我们会放在数据库中
middle 表:
middle 表示角色和权限的关系
什么角色,有什么权限,就是在这张表中展示的
创建 JavaBean
省略构造器和 getter setter toString
这里,主要
users:
public class Users {
private Integer userId;
private String loginName;
private String password;
private String realName;
private Integer sex;
private String email;
private String address;
private String phone;
private String cardId;
private String desc;
private Integer roleId;
//这里,要有一个对象,指向 roleId代表的Role对象
private Role role;
}
role:
public class Role {
private Integer roleId;
private String roleName;
private Integer roleState;
//包含多个用户信息
private List<Users> usersList;
//与menu是多对多关系
private List<Menu> menuList;
}
menu:
public class Menu {
private Integer menuId;
private String menuName;
private Integer upmenuId;
private Integer state;
private String desc;
private String url;
//与role是多对多关系
private List<Role> roleList;
}
注意:
中间表不需要创建实体类,其作用,只是为了方便在数据库中查询
编写持久层代码
这里就不演示了,就是一般的 DAO和DAO实现,各位可以按照自己的习惯,选择框架去实现
前端
前端也就是一般的业务逻辑所包含的内容,这里也不再演示
动态权限显示
这里,我们在每次登录成功的时候,就会按照这个用户,去查其对应的角色,然后,再去查看这个角色所对应的权限,最后,将这个权限动态的显示在用户可以操作的部分
这里因为代码比较复杂,我就不演示了
主要要理解的,就是一开始那4张表和五张表的图