基于SHIRO的管理后台权限认证系统实现(一)
程序员文章站
2022-05-08 12:37:47
...
基于SHIRO的管理后台权限认证系统实现(一)
一、项目需求:
1.优化原有的管理后台的权限管理
原角色权限管理:
用户管理菜单:添加/编辑用户,离职/在职,密码创建,部门、职位划分
角色管理菜单:关联某一角色,角色对应一系列的权限;如:用户是录入人员,则能看到所有商品相关的管理菜单;如果职位再是主管,则能看到全部数据;即通过职位、部门、角色三者联合确认权限
2.权限细粒度化
权限对应具体的某一个菜单、页面上的按钮
3.分配灵活
与具体的部门、职位不再关联
二、项目实现
1.用户表 user
id | 用户Id |
name | 用户登录名 |
password | 用户密码 |
status | 离职在职 |
备注:
密码加密使用SHIRO自带的功能,不可逆;登录验证时,将用户输入的密码按照同样规则加密与库中存储的密码比较
2.权限表 permission
id | 权限Id |
name | 权限名称 |
value | 字符串表示 |
pid | 权限父类Id |
type | 类型:按钮or菜单 |
备注:
权限对应于管理后台以后的功能;需提前整理好;预先将数据录入到表中
由于权限要精确到页面按钮,故对已有数据资源进行整理,分级
举例:
权限添加功能以树状图形展示,故需要有pid,pid即上一级的权限的编号
PID=0,根目录
以PID=0为父类的是一级菜单
再以一级菜单作为PID的是其所属的子集菜单,子集菜单分为按钮和菜单两种
页面展示位树形,在后端将数据组装后
使用:
为用户授权时,勾选权限前面的复选框,将用户与权限的关联存储在关联表中
3.用户与权限关联表 user_permission
id | 主键 |
userId | 用户Id |
permissionId | 权限Id |
4.角色表 role
id | 主键 |
name | 角色名称 |
value | 字符串表示 |
5.用户角色关联表 user_role
id | 主键 |
userId | 用户Id |
roleId | 角色Id |
6.角色权限关联表 role_permission
id | 主键 |
roleId | 角色Id |
permissionId | 权限Id |
7.名词解释
身份及凭证:即用户登录名以及密码;调用doAuth方法进行验证,底层实现即为通过username查询user表,比较password
角色:权限的集合;为用户分配一批权限
权限:用户可以执行的功能
8.具体实现
8.1 权限管理页面
准备:预先整理当前网站的需分配的权限;按照层级的方式归纳;添加到数据表中
展示:
列表页面:提供添加、修改、删除按钮;页面内容采用折叠覆盖的方式,只展示一级的菜单,一级菜单相应的二级以及其他级别菜单隐藏;
添加按钮:列表页面上面的添加按钮为添加一级菜单,一级菜单上的添加按钮为添加二级菜单,以此类推
删除按钮:判断当前是否有角色或用户拥有此权限,是否确认删除,若是,同时删除与此权限相关联的其他数据
备注:
删除权限的同时,删除与该权限有关的其他表中的数据,以免存在脏数据
8.2 角色管理页面
列表:展示所有角色,添加、编辑、删除
授权:跳转新页面,展示所有权限列表
规定:
一级权限的pid = 0 ;
二级权限的pid = 0 ;
三级权限的pid = 相应的二级权限的Id
以此类推
配置前端进行调试,将数据已多重集合的方式组装,左侧提供复选框,勾选相应的权限,提交保存到角色权限关联表中
备注:删除同上
8.3 用户管理页面
列表:展示当前所有用户
用户可按照另一个维度进行划分展示:职位、部门、分组等等
角色:展示角色列表,添加角色
权限:特殊授权,是用户分配角色的功能的补充,意思是用户在获得一批权限后还想拥有另一个职能中的一个查看权限,即可通过授权来完成
8.4 说明:
具体的实现过程中是通过比较 权限的字符串或角色的字符串来实现的
9.权限判断的实现
9.1 用户登录
用户登录过程中,首先做认证验证,如果身份凭证不符,即不允许登录;
用户登录成功,做授权认证,通过
userId --> user_role --> List<roleId> --> role_permission --> List<permissionId>
userId --> user_permission --> List<permissionId>
取两个集合的并集并去重,使用Set处理
9.2 将此集合放入用户登录的Session中(shiro本身维护的Session,可通过配置文件进行维护)
9.3 权限认证
在每一个Action上方配置权限标签,即请求该Action需有此权限(即表中存放的字符串)
9.4 若使用VM
可通过VM的自定义函数实现页面上的按钮展示的判断--即细粒度的权限实现
10.其他
10.1
理清思路,细节实现可以参考网上的文章。
总得设计思想:
首先创建一个admin用户,手动创建直接插入数据库中
创建用户及分配权限
后续创建的用户登录成功后,会按照框架的设计走权限验证
简单的说,权限认证就是从数据库中读取此用户拥有的权限
此处,需要注意,由于session的时效性的原因,用户登录成功后直到用户退出前,他的权限都不会改变;可以修改底层的缓存实现,进而可以实现,admin修改用户权限后,不需退出登录即可变更权限。
博文参考:
http://jinnianshilongnian.iteye.com/blog/2018936
推荐阅读
-
django认证系统实现自定义权限管理的方法
-
vue中如何实现后台管理系统的权限控制的方法示例
-
vue中如何实现后台管理系统的权限控制的方法步骤
-
玩一玩基于Token的 自定义身份认证+权限管理
-
如何实现后台管理系统的权限路由和权限菜单
-
基于Vue实现后台系统权限控制的示例代码
-
niaobulashi-一个基于springboot shrio的权限管理系统
-
jwt,spring security ,feign,zuul,eureka 前后端分离 整合 实现 简单 权限管理系统 与 用户认证的实现
-
【基于SSM后台文档管理系统】 ---- (一) 登录实现以及用Token机制保存登录状态
-
django认证系统实现自定义权限管理的方法