表设计
开发用户-角色-权限管理系统,首先我们需要知道用户-角色-权限管理系统的表结构设计。

在用户-角色-权限管理系统找那个一般会涉及5张表,分别为:

1.sys_users用户表
2.sys_roles角色表
3.sys_permissions权限表(或资源表)
4.sys_users_roles用户-角色关联表
5.sys_roles_permissions角色-权限关联表(或角色-资源关联表)

详细的建表信息如下

sys_users

解释
用户表中至少包含以上的字段,主键id、用户名username、密码password、盐值salt(因为密码是经过Shiro加密的,需要通过盐值校验,由Shiro生成,不需要用户手动填写)、角色列表roleId(这个字段不是必须的,仅实现在展示用户信息的时候能同时展示用户当前角色)、是否锁定locked(决定当前账户是否是锁定的)。
创建新的用户,仅需要输入用户名和密码即可,盐值由Shiro生成,角色列表和是否锁定都可以在后期管理。

其中是否锁定字段类型为tinyint(1),设置这种类型,数据库中实际存储的是int类型数据,一般是0和1,在使用Mybatis取这个字段的数据时,Mybatis会自动将tinyint(1)字段值为0的转换成false,将字段值为1以上的转换为true。

sys_roles

解释
角色表中role角色名称一般为存储着类似user:create这种格式,Shiro在Realm中校验用户身份的时候会通过role这个字段值进行校验;description是此角色的描述信息,比如用户创建。
其中pid表示父节点,就是说,当前的角色可能有上级节点,比如老师,这个角色可能就有父节点计科教师,如果存在父节点,这个字段值就是父级节点的ID,根据这个ID,在展示数据的时候就很方便的展示出其在哪个父节点下。
available表示当前节点是否锁定,同样是tinyint(1)类型,如果为false就说明没有锁定。

sys_users_roles

解释
用户角色表就比较简单了,仅仅包含了主键id、用户IDuser_id、角色IDrole_id;这张表主要描述指定用户与角色间的依赖关系。其中用户表与角色表是一对多的关系,一个用户可以拥有多个角色。

sys_permissions


解释
权限表和角色表类似,其中不同的字段是rid,这个字段表示此权限关联的角色的id值,当然不是必要的,但是后端角色更新时用到了,后面会介绍。

sys_roles_permissions

解释
角色-权限表和用户-角色表类似,包含了主键id、角色IDrole_id、权限IDpermission_id,主要描述角色和权限间的依赖关系,同样,角色和权限间也是一对多的关系,一个角色会关联多个权限。

schema.sql
上述表设计的源码如下:

-- create database shiro default character set utf8;drop table if exists sys_users;
drop table if exists sys_roles;
drop table if exists sys_permissions;
drop table if exists sys_users_roles;
drop table if exists sys_roles_permissions;create table sys_users (id bigint auto_increment comment '编号',username varchar(100) comment '用户名',password varchar(100) comment '密码',salt varchar(100) comment '盐值',role_id varchar(50) comment '角色列表',locked bool default false comment '是否锁定',constraint pk_sys_users primary key(id)
) charset=utf8 ENGINE=InnoDB;
create unique index idx_sys_users_username on sys_users(username);create table sys_roles (id bigint auto_increment comment '角色编号',role varchar(100) comment '角色名称',description varchar(100) comment '角色描述',pid bigint comment '父节点',available bool default false comment '是否锁定',constraint pk_sys_roles primary key(id)
) charset=utf8 ENGINE=InnoDB;
create unique index idx_sys_roles_role on sys_roles(role);create table sys_permissions (id bigint auto_increment comment '编号',permission varchar(100) comment '权限编号',description varchar(100) comment '权限描述',rid bigint comment '此权限关联角色的id',available bool default false comment '是否锁定',constraint pk_sys_permissions primary key(id)
) charset=utf8 ENGINE=InnoDB;
create unique index idx_sys_permissions_permission on sys_permissions(permission);create table sys_users_roles (id  bigint auto_increment comment '编号',user_id bigint comment '用户编号',role_id bigint comment '角色编号',constraint pk_sys_users_roles primary key(id)
) charset=utf8 ENGINE=InnoDB;create table sys_roles_permissions (id bigint auto_increment comment '编号',role_id bigint comment '角色编号',permission_id bigint comment '权限编号',constraint pk_sys_roles_permissions primary key(id)
) charset=utf8 ENGINE=InnoDB;

拓展
上面就是当前用户-角色-权限系统的表设计。细心的你可能会发现这些表中并不包含外键约束。

为什么不设计外键呢?

可能你会跟我一样有这样的疑问。比如用户表和角色表间,我们这里创建了用户-角色表来实现两者的关联;并没有通过给两张表建立外键来实现一对多、多对多的关联关系。
因为如果你要建立外键来关联两张表,你需要遇到如下:

如果两张表之间存在一对多的关系,在给一的一方新增数据的时候,你要考虑多的一方是否存在指定的id。
如果两张表之间存在一对多的关系,在删除多的一方时你要先删除其关联的一的一方,再删除多的一方。

也就是说如果使用了外键关联,那么在对表进行数据操作时就必须考虑另一张关联的表,相当于两张表就绑在一起了,操作这张表就必须考虑另一张关联表。

但是实际中,我们不想立即就修改或更新关联表的数据,我可能一会再去更新另一张关联表的数据,那么就产生了这种方式:通过单独建立一张关联来实现两张表的数据关联。

所以,我建议大家在设计表时尽量减少表与表直接的外键约束,这样能避免很多麻烦,并且两张表之间的关联关系也会格外清晰。

实例
上面创建了用户-角色-权限表以及其关联表,下面就介绍一些实际的案例吧!

初始化表

insert into sys_users values(1,'TyCoding','123','salt','管理员',0);
insert into sys_roles values(21,'user:create','用户创建',0,0);
insert into sys_permissions values(31,'user:create','用户创建',0,0);
insert into sys_users_roles values(1,1,21);
insert into sys_roles_permissions values(1,21,31);

查询
根据用户名查询其角色

[mysql> SELECT r.id, r.role, r.description FROM sys_users u, sys_roles r, sys_users_roles ur WHERE u.username = 'TyCoding' AND u.id = ur.user_id AND r.id = ur.role_id;
+----+-------+-------------+
| id | role  | description |
+----+-------+-------------+
| 21 | admin | 管理员      |
+----+-------+-------------+
1 row in set (0.00 sec)

从上面的SQL中足以看出,通过关联表查询另一张关联的数据要点在于WHERE条件中添加关联表与两张表的关系,在这里即是关联表中存在两张表的主键id,所以把相同的字段加入WHERE条件过滤就能查询到了。

根据用户名查询其权限

[mysql> SELECT p.id, p.permission, p.description FROM sys_users u, sys_roles r, sys_users_roles ur, sys_permissions p, sys_roles_permissions rp WHERE u.username = 'TyCoding' AND u.id = ur.user_id AND r.id = ur.role_id AND r.id = rp.role_id AND p.id = rp.permission_id;
+----+-------------+--------------+
| id | permission  | description  |
+----+-------------+--------------+
| 31 | user:create | 用户创建     |
+----+-------------+--------------+

1 row in set (0.00 sec)
根据角色id查询其权限

[mysql> SELECT p.id, p.description FROM sys_permissions p, sys_roles r, sys_roles_permissions rp WHERE r.id = 21 AND rp.role_id = r.id AND rp.permission_id = p.id;
+----+--------------+
| id | description  |
+----+--------------+
| 31 | 用户创建     |
+----+--------------+

1 row in set (0.00 sec)
更新user表中role_id字段
我们设计的sys_users表中,存在一个字段role_id,目的是用来展示当前用户关联的角色名称,但是我们直接更新sys_roles表的description字段时,又不会更新sys_users表中的role_id字段。

所以,这里我们要通过更新的角色数据来更新sys_users表中的role_id字段。

[mysql> UPDATE sys_users u, sys_users_roles ur SET u.role_id = '管理员-更新' WHERE ur.role_id = 21 AND u.id = ur.user_id;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> SELECT * FROM sys_users;
+----+----------+----------+------+------------------+--------+
| id | username | password | salt | role_id          | locked |
+----+----------+----------+------+------------------+--------+
|  1 | TyCoding | 123      | salt | 管理员-更新      |      0 |
+----+----------+----------+------+------------------+--------+
1 row in set (0.00 sec)

根据权限ID查询其角色

[mysql> SELECT r.id, r.description, r.pid FROM sys_permissions p, sys_roles r, sys_roles_permissions rp WHERE p.id = 31 AND p.id = rp.permission_id AND r.id = rp.role_id;
+----+-------------+------+
| id | description | pid  |
+----+-------------+------+
| 21 | 管理员      |    0 |
+----+-------------+------+
1 row in set (0.00 sec)

shiro权限框架中五张基本数据表相关推荐

  1. (转) shiro权限框架详解06-shiro与web项目整合(上)

    http://blog.csdn.net/facekbook/article/details/54947730 shiro和web项目整合,实现类似真实项目的应用 本文中使用的项目架构是springM ...

  2. SpringBoot整合Shiro权限框架

    前言 在系统管理中,权限是非常重要的一个环节.目前权限框架中使用比较多的有Shiro.Spring Security.

  3. 视频教程-Apache Shiro权限框架实战+项目案例视频课程-Java

    Apache Shiro权限框架实战+项目案例视频课程 拥有10余年项目实战经验. 2006-2011在nttdata从事对日软件开发类工作. 2011-2015在HP从事技术服务工作. 擅长于j2e ...

  4. 在thinkphp框架中如何对多表进行操作(thinkphp多表查询方法)

    在thinkphp框架中如何对多表进行操作(thinkphp多表查询方法) 本文讲解了在thinkphp框架中如何对多表进行操作,ThinkPHP是一个开源的PHP框架,是为了简化企业级应用开发和敏捷 ...

  5. springboot 2.x 整合 shiro 权限框架

    序 在实际项目中,经常需要用到角色权限区分,以此来为不同的角色赋予不同的权利,分配不同的任务.比如,普通用户只能浏览:会员可以浏览和评论:超级会员可以浏览.评论和看视频课等:实际应用场景很多.毫不夸张 ...

  6. SpringBoot2.x 整合 shiro 权限框架

    每天早上七点三十,准时推送干货 在实际项目中,经常需要用到角色权限区分,以此来为不同的角色赋予不同的权利,分配不同的任务.比如,普通用户只能浏览:会员可以浏览和评论:超级会员可以浏览.评论和看视频课等 ...

  7. java权限框架_Java高级工程师必备技术栈-由浅入深掌握Shiro权限框架

    权限系统在任何一个系统中都存在,随着分布式系统的大行其道,权限系统也趋向服务化,对于一个高级工程师来说,权限系统的设计是必不可少需要掌握的技术栈 Apache Shiro™是一个功能强大且易于使用的J ...

  8. 经典权限系统设计(五张表)

    经典权限系统设计(五张表) 大致用到5张表:用户表(UserInfo).角色表(RoleInfo).菜单表(MenuInfo).用户角色表(UserRole).角色菜单表(RoleMenu). 各表的 ...

  9. springMVC整合shiro权限框架示例与实践

    2019独角兽企业重金招聘Python工程师标准>>> 为什么写这篇文章 看过那么多框架.教程,大部分shiro的文章或教程是我见过思路最糟糕的.作者完不清楚想要表达什么起到什么作用 ...

  10. SSM整合shiro权限框架

    一.SSM整合shiro框架 1.步骤 1.添加shiro框架需要的jar包,包括shiro-core.shiro-web.shiro-spring的关系依赖 <!-- shiro jar包依赖 ...

最新文章

  1. Nature综述:古菌的多样性、生态功能和进化史
  2. [BZOJ2693]jzptab
  3. Matlab并行编程函数cellfun arrayfun
  4. 深入了解数据分析丨《精益数据分析》超详细读书笔记
  5. 项目中的加减法--《最后期限》读书笔记(1)
  6. python 数据结构与算法
  7. JS 仿淘宝幻灯片 非完整版 小案例
  8. 海外php程序员,国外PHP程序员的13个好习惯_php
  9. 安师大计算机专业分数线,安徽师范大学
  10. xcode 获取模拟器app沙盒路径_使用Xcode12进行App内购测试
  11. 20行代码简单python爬虫,爬虫实例
  12. 从0开始使用腾讯云GPU服务器
  13. 通过dns2tcp绕过校园网认证进行免费上网
  14. 一个心理医生和一个心理不正常的小孩的冷笑话
  15. 拥有70多个名字的南京,改城市名就像改微信名一样
  16. 你想要的WinForm界面开发教程在这里 - 如何使用自定义用户控件
  17. 机器学习项目汇总,值得收藏!
  18. 云台和华为p30pro_除了拍月亮 华为P30 Pro还拍出了首部轻科幻CG短片
  19. docker 容器启动提示,ipv4不能被使用
  20. 纵观DeSci:起源、代表项目与未来发展

热门文章

  1. wamp+php+下载,WAMP(Windows+Apache+Mysql+PHP) 下载配置一条龙
  2. word2016 添加参考文献的方法
  3. 2020金三银四——在家也能躺拿大厂offer
  4. meta pseudo label
  5. Android Dialog之间的层级设置(WindowManager.LayoutParams)
  6. python机器学习记录4and5 支持向量机
  7. Encrypted traffic 加密流量分类任务进展综述
  8. 音声合成:音高、泛音、谐波、基频 到底是什么概念?
  9. 806管理学原理考研复习资料
  10. 高效解答二进制数“多异或”和“多同或”连续运算问题