Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。
不同身份的人进入系统所完成的操作不同,如下图,当一个系统包含左侧所有菜单功能时,要求不同人员登录展示不同权限下的菜单,这时候就需要学习权限管理,看完本文就可轻松掌握。

1.1 基于主页的权限管理
设计多种页面,当不同权限的用户访问时,跳转不同的用户,如下图,用户1登录跳转到index1.html,用户2登录跳转到index2.html,缺陷比较大且繁琐,不建议使用。

缺点:适用于用户级别较少的,不能动态分配权限
1.2 基于用户和权限的权限管理
利用用户表、用户权限表、权限表三张表,每个用户在中间表分配权限

实现权限的动态分配,但是每个用户对应一个用户权限,10个人就得10个,数据比较冗余,这样就衍生了下面的五张表
1.3 基于角色的访问控制(RBAC)
创建用户表、角色表、权限表和两张中间表用户角色表、角色权限表五张表,每次新加用户时只需要授予角色就可获得相对的权限。

给同类人员的其中一个人授予权限可以再加一张用户权限表,直接授予权限。

2.1 认证和授权

2.2 常见的安全框架
2.3 shrio核心功能

Anthentication 认证,验证用户是否有相应的身份 登录认证 Authorization
授权,权限验证,通过认证的用户检查是否有权限或者角色 Session Management
会话管理,用户在认证成功后创建会话,在没有退出之前,当前用户的所有信息都会保存在这个会话中 Cryptograsphy 加密,对敏感信息加密
支持的特性:
1.Web Support Shrio提供了过滤器,可以通过过滤器拦截web请求来处理web应用的访问控制
2.Caching 缓存支持,shiro可以缓存用户信息以及用户的角色权限信息,可以提高执行效率
3.concurrency shiro支持多线程应用
4.Run As 允许一个用户以另一种身份去访问
5.Remeber Me 记住密码
6.Testing 提供测试支持
Shiro是一个安全框架,不提供用户、权限的维护,用户的权限管理需要我们去设计
2.4 Shiro核心组件

Subject、Security Manager、Realms
- Subject:表示待认证和授权的用户
- Security Manager:Shiro框架的核心,Shiro就是通过Security Manager来进行内部实例的管理,并通过它来提供安全管理的各种服务
- Realm:相当于shiro进行认证和授权的数据源

2.5 shiro的使用
1.添加maven依赖
2.创建shiro的配置文件
在resource下创建ini后缀文件
3.使用测试
2.6 shrio认证流程

3.1 导入依赖
application.yml配置
3.2 Shiro配置
SpringBoot没有提供对Shiro的自动配置,因为Spring家族有自己的安全框架
- config/shiroConfig.java
3.3 测试
- UserServiceImpl.java
- UserController.java
- login.html
- 通过shiro.ini定义正确的登录密码

密码正确跳转到index.html
密码错误跳转到login.html
3.4 内置JDBCRealm作为数据源

如果使用JdbcRealm,则必须提供JdbcRealm所需要的表结构(权限设计)
JdbcRealm规定的表结构

表中的字段必须保持一致,可以加字段
- 用户信息表:users
- 角色信息表: user_roles
- 权限信息表:roles_permissions

从图中可以看出用户所对应的权限
步骤
配置Shiro
测试结果同上

3.5 shiro的标签的使用
当用户认证进入到主页之后,需要显示用户信息及当前用户的权限信息,shiro提供了一套标签用于在页面来进行权限数据的呈现
Shiro提供了可供JSP使用的标签以及Thymeleaf标签
- JSP页面中引用
- Thymeleaf模板中引用
- 在pom.xml中导入thymeleaf模板对shiro标签的支持依赖
- 在ShiroConfig中配置Shiro的方言支持
- Thymeleaf模板中引入shiro的命名空间
常用标签
具体用法如下:
数据库添加如下信息

当游客身份登录

当admin管理员登录

当仓管人员登录

当行政人员登录

当要使用自己定义的数据结构表,就需要告诉Realm,更改为自己设计的数据源
4.1 数据库设计

SQL语句

从表中就可以查询出lisi的角色为cmanager,权限有[入库,出库,修改,查询]
一个人可以关联多个角色,权限取多个角色的并集
4.2 创建DAO层
编写Mapper映射
UserMapper.xml
RoleMapper.xml
PermissionMapper.xml
4.3 application.yml
4.4 pom.xml
4.5 自定义Realm配置类
要使用自己设计的权限数据库,这个时候的Realm就要继承AuthorizingRealm类使它成为一个Realm类。
在config配置包里创建MyRealm.java
4.6 shiro配置
ShiroConfig.java
4.7 shiro业务层
4.8 Controller层
4.9 整合layUI
导入layui包,官网复制后台框架代码
实现不同权限的管理员登录,展示的菜单不同
zhangsan 超级管理员 显示全部菜单

wangwu xmanager管理员,对仓库管理只有查看的权限

layui实现点击左边菜单,内容右边显示


用户密码在存储到数据库之前根据一定的加密规则加密为密文。加密规则可以自定义,在项目开发中通常使用BASE64和MD5编码方式进行加密
BASE64:可以反编码的编码方式。
MD5:不可逆的编码方式(网站上常见的MD5解密,只不过是列出常见密码的密文进行查询,密码一旦复杂就解密不出来了,为了防止暴力穷举激活成功教程,可以加盐加密)

5.1 Shiro加密
5.2 密码认证
在ShiroConfig中配置加密规则
修改上文的ShiroConfig.java,设置加密规则认证时就生效,没有设置加密规则,默认明文校验

可以正常登录,如果密码加盐了,Realm在返回认证信息时需要返回盐数据,在自定义Realm中修改

- 在Shiro过滤器中进行配置,配置logout对应的路径

- 在页面的退出按钮上添加路径/logout

当点击退出登录按钮时,shiro会拦截logout的路径调用subject.logout()登出。
一般的授权方式有两种:一、HTML授权,即用户登录只显示自己权限的菜单,没有权限的菜单不显示。二、过滤器授权,对所有用户显示所有菜单功能,当用户点击菜单后再验证是否有此权限,无权限提示权限不足。
7.1 HTML授权
- shiro标签
7.2 过滤器授权

7.3 注解授权
- 配置Spring对Shiro的注解支持
- 在请求的控制器添加权限注解
当无权人员访问时会抛出AuthorizationException异常,可以配置全局异常类。
7.4 手动授权
在代码中进行权限校验,一般写在业务层
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/11143.html