认证传送门:https://blog.csdn.net/JavaJieRui/article/details/108465791
授权传送门:https://blog.csdn.net/JavaJieRui/article/details/108495686
一、整合的思路
继上次说完了Shiro中的授权之后,Shiro中的认证和授权就全部为大家讲解完了,相信大家是跟着前两篇文章看过来的对Shiro在程序中进行认证和授权的操作都已经略知一二了,下面就为大家讲解一下Shiro在SpringBoot中的应用整合,同时在之前我们做的认证授权都是在代码中硬编码直接写死的,而在我们这次与SpringBoot的整合开发中,将会使用数据库中的数据来替代代码中的数据,更加真实的模拟我们日常在工作中对权限控制开发。
首先我们不论是开发任何功能,都是要对需求和思路进行清晰透彻的梳理和理解,虽然我们本次开发是模拟的真实开发场景,我们也要对开发之前的需求,实现的流程进行梳理。下面先为大家展示一张流程图,之后我会通过整张流程图再来讲解Shiro与SpringBoot整合开发的思路。
首先,我们要开发权限第一步是要先有一个SpringBoot的应用,这个我们做权限是对SpringBoot应用中的所有资源进行保护,如图所示,一个页面可以是一个被保护的资源。同样,程序中的一个方法也可以是一个被保护的资源,但是在一个SpringBoot的应用中,不仅仅要有被保护的资源,还要有公共资源,因为我们如果没有公共资源,登录或者注册的页面就没有办法被用户访问到,那假如说连注册和登录都是被保护起来的资源,那我们这个系统又怎么用呢?
所以门将所有的系统资源分为了两大类,一类是公共资源例如:登录页、登录的方法、注册页、注册的方法、可能还会有找回密码等等的这些统一划分为公共资源,而例如主页,或对系统内部数据的增删改查等的操作就被划分为受限资源,此时这些资源就要被我们用Shiro做的权限验证来保护起来。
前面我们说了那么多怎么把系统分为受限资源,公共资源,怎么用Shiro对他们进行权限的保护,但这些都有一个大的前提,必须让Shiro拿到SpringBoot应用中的所有的请求,为什么呢?应用中的所有资源都是通过客户通过一个又一个的请求来访问的,假如说我们的Shiro连请求都拿不到,又何谈划分资源何谈保护资源呢,所以所有的请求过来,首先要经过一个过滤器。对请求分类,看是受限资源还是公共资源,如果是公共资源不需要认证则直接放行,如果是受限资源呢?受限资源受限经过SecurityManager这个类进行认证处理,从我们的自定义Realms中拿到数据,同时Realms中还会有一系列的密码凭证匹配器,三列次数,算法名称等等一系列的操作。认证通过之后还要进行授权的操作,也就是说虽然你通过了认证,但是我们的Shiro还要来看看你是否有操作这个资源的权限,这样也就达到了相对细粒度的权限控制。
好了经过上面的一张流程图的展示以及对图的解释,我相信大家已经对流程有了相应的了解,下面就可以进行实战开发了。
二、环境搭建
首先上项目目录结构
POM文件<这时还没有引入Shiro>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.csdn</groupId>
<artifactId>springboot_shiro_jsp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_shiro_jsp</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--jsp解析的依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!--可能会在jsp中用到c标签-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties
#指定端口号
server.port=8090
#请求路径中加上项目名
server.servlet.context-path=/shiro
#指定项目名
spring.application.name=shiro
#将mvc视图改为jsp,前缀、后缀
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
在新建的webapp中新建一个index.jsp:
在IDEA中设置它的工作目录:
接下来启动,看一下效果: