前阵子在先后端分离项目中集成shiro项目,折腾了一会儿,参考了网上一些博客,发现大多都仍是以前传统的模式,并不适用于先后端分离结构。今天抽空整理了下demo,方便之后使用以及后来人参考。web
关于shior框架的介绍能够参考这篇,须要引入相关jar以下:redis
<!--shiro核心jar from 官网 www.1b23.com--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <!--实现session共享。缓存等--> <dependency> <groupId>org.crazycake</groupId> <artifactId>shiro-redis</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
未整合Spring/SpringBoot之前,是须要在Web.xml
中定义org.apache.shiro.web.servlet.ShiroFilter过滤器的
Shiro的初始化工做在web.xml中设置监听器完成spring
<listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <filter> <filter-name>ShiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> </filter> <filter-mapping> <filter-name>ShiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> Shiro 的 EnvironmentLoaderListener 就是一个典型的 ServletContextListener,它也是整个 Shiro Web 应用的入口 。
EventListener 是一个标志接口,里面没有任何的方法,Servlet 容器中全部的 Listener 都要继承这个接口(这是 Servlet 规范)。apache
ServletContextListener 是一个 ServletContext 的监听器,用于监听容器的启动与关闭事件,包括以下两个方法:
void contextInitialized(ServletContextEvent sce); // 当容器启动时调用
void contextDestroyed(ServletContextEvent sce); // 当容器关闭时调用后端
能够从 ServletContextEvent 中直接获取 ServletContext 对象。跨域
EnvironmentLoaderListener 不只实现了 ServletContextListener 接口,也扩展了 EnvironmentLoader 类,应该是须要在 Servlet 容器中调用 EnvironmentLoader 对象的生命周期方法
从 Shiro 1.2 开始引入了 Environment/WebEnvironment 的概念,即由它们的实现提供相应的 SecurityManager 及其相应的依赖。ShiroFilter 会自动找到 Environment 而后获取相应的依赖。
经过 EnvironmentLoaderListener 来建立相应的 WebEnvironment,并自动绑定到 ServletContext,默认使用 IniWebEnvironment 实现。缓存
EnvironmentLoader的功能:安全
当容器启动时,读取 web.xml 文件,从中获取 WebEnvironment 接口的实现类(默认是 IniWebEnvironment),初始化该实例,并将其加载到 ServletContext 中。
当容器关闭时,销毁 WebEnvironment 实例,并从 ServletContext 将其移除。
IniWebEnvironment的功能:springboot
查找并加载 shiro.ini 配置文件,首先从自身成员变量里查找,而后从 web.xml 中查找,而后从 /WEB-INF 下查找,而后从 classpath 下查找,若均未找到,则直接报错。
当找到了 ini 配置文件后就开始解析,此时构造了一个 Bean 容器(至关于一个轻量级的 IOC 容器),最终的目标是为了建立 WebSecurityManager 对象与 FilterChainResolver 对象,建立过程使用了 Abstract Factory 模式
EnvironmentLoaderListener无非就是在容器启动时建立 WebEnvironment 对象,并由该对象来读取 Shiro 配置文件,建立WebSecurityManager(安全管理器)与 FilterChainResolver(过滤链解析器) 对象,在ShiroFilter中起到了重要做用。session
ShiroFilter 是整个 Shiro 的入口点,用于拦截须要安全控制的请求进行处理。
由于它拦截了全部的请求,后面的 Authentication(认证)和Authorization(受权)都由ShiroFilter说了算
和Spring/SpringBoot整合之后,咱们只须要注入ShiroFilter便可,ShiroFilter由ShiroFilterFactoryBean负责建立。因此注入ShiroFilterFactoryBean,由 ShiroFilterFactoryBean建立 ShiroFilter便可
服务端需开启跨域支持
只返回Json,不要重定向
OPTIONS Request 不进行鉴权操做