前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前后端分离结构中使用shiro进行权限控制

前后端分离结构中使用shiro进行权限控制

作者头像
河岸飞流
发布2019-08-08 17:25:42
1.2K0
发布2019-08-08 17:25:42
举报
文章被收录于专栏:开发杂记

前阵子在前后端分离项目中集成shiro项目,折腾了一下子,参考了网上一些博客,发现大多都还是之前传统的模式,并不适用于前后端分离结构。今天抽空整理了下demo,方便以后使用以及后来人参考。

一、springboot中集成shiro框架

关于shior框架的介绍可以参考这篇,需要引入相关jar如下:

代码语言:javascript
复制
    <!--shiro核心jar-->
    <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中设置监听器完成

代码语言:javascript
复制
<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 规范)。

在这里插入图片描述
在这里插入图片描述

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的功能:

查找并加载 shiro.ini 配置文件,首先从自身成员变量里查找,然后从 web.xml 中查找,然后从 /WEB-INF 下查找,然后从 classpath 下查找,若均未找到,则直接报错。 当找到了 ini 配置文件后就开始解析,此时构造了一个 Bean 容器(相当于一个轻量级的 IOC 容器),最终的目标是为了创建 WebSecurityManager 对象与 FilterChainResolver 对象,创建过程使用了 Abstract Factory 模式 EnvironmentLoaderListener无非就是在容器启动时创建 WebEnvironment 对象,并由该对象来读取 Shiro 配置文件,创建WebSecurityManager(安全管理器)与 FilterChainResolver(过滤链解析器) 对象,在ShiroFilter中起到了重要作用。

ShiroFilter 是整个 Shiro 的入口点,用于拦截需要安全控制的请求进行处理。 因为它拦截了所有的请求,后面的 Authentication(认证)和Authorization(授权)都由ShiroFilter说了算

和Spring/SpringBoot整合以后,我们只需要注入ShiroFilter即可,ShiroFilter由ShiroFilterFactoryBean负责创建。所以注入ShiroFilterFactoryBean,由 ShiroFilterFactoryBean创建 ShiroFilter即可

二、前后端分离中遇到的坑
  1. 服务端需开启跨域支持
  2. 只返回Json,不要重定向
  3. OPTIONS Request 不进行鉴权操作

完整代码参考:https://github.com/xieshuang/spring-learn-demo/tree/master/springshiro

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-06-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、springboot中集成shiro框架
  • 二、前后端分离中遇到的坑
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档