springboot整合shiro 配置详解及原理分析

springboot整合shiro+jwt实现前后端分离认证授权

  • 前言
  • 问题
  • ShiroFilter
    • 什么是ShiroFilter
  • SecurityManager
    • 什么是SecurityManager?
  • ShiroConfig
    • 写在前面的话:
    • ShiroConfig类:
    • CustomRealm类:
  • shiroConfig
    • 原理

前言

最近搞了下shiro安全框架,网上找了好多篇博客,感觉要么都是复制粘贴,要么就是错误百出。至于稍微讲解一下为什么要这么做,就更别说了。这篇文章就教大家如何将 Shiro 整合到 SpringBoot 中,并且避开一些小坑,由浅入深,从最基本的配置开始,一步一步加入新的功能。这样理解起来也稍微简单点
参考链接:我是你妹他哥 SpringBoot2.0集成Shiro

问题

首先我们要明白为什么使用shiro,以及需要用shiro实现哪些功能,毫无疑问我们需要使用它的认证功能和授权功能,那么如何实现认证及授权?

什么是shiro这个问题我们不多做解释,这里默认大家已经对shiro的基本概念有了一些了解。我们主要关心的是如何使用及为什么这么使用,这里先还是要介绍一下shiro的核心流程,例如下图,当用户发起请求的时候,shiro是如何处理请求并实现授权或认证?
springboot整合shiro 配置详解及原理分析_第1张图片

当浏览器发起请求,首先是进入到ShiroFilter,那么什么是ShiroFilter?它是干什么的?我们来分析一下:

ShiroFilter

什么是ShiroFilter

ShiroFilter,它是在整个 Shiro Web 应用中请求的门户,所有的请求都会被 ShiroFilter 拦截并进行相应的链式处理。ShiroFilter 往上有五层,最上层是 Filter(即 javax.servlet.Filter),它是 Servlet 规范中的 Filter 接口。
springboot整合shiro 配置详解及原理分析_第2张图片

那么分析完我们发现,ShiroFiler是要依赖SecurityManager,那么什么又是SecurityManager?

SecurityManager

参考 杨白云-001 shiro securityManager分析

什么是SecurityManager?

SecurityManager是Shiro核心,主要协调Shiro内部的各种安全组件,这个我们不需要太关注,只需要知道可以设置自定的Realm。
我们来看看shiro中都有哪些帮我们实现好了的SecurityManager

接口SecurityManager,继承了接口Authorizer,SessionManager,Authenticator,定义了三个方法分别是login、logout、createSubject,
springboot整合shiro 配置详解及原理分析_第3张图片
springboot整合shiro 配置详解及原理分析_第4张图片
我们再来看看该接口的实现类都有哪些
springboot整合shiro 配置详解及原理分析_第5张图片
通过上图我们发现,SecurityManager的实现类有很多,分别是:

  • CachingSecurityManager:接口CachingSecurityManager增加了缓存和日志功能和设置 EventBus
    springboot整合shiro 配置详解及原理分析_第6张图片

  • RealmSecurityManager:RealmSecurityManager增加设置读取realm方法
    springboot整合shiro 配置详解及原理分析_第7张图片

  • AuthenticatingSecurityManager :抽象类AuthenticatingSecurityManager 支持使SecurityManager封装一个Authenticator实例,把对验证的操作都委托给该实例。
    springboot整合shiro 配置详解及原理分析_第8张图片

  • AuthorizingSecurityManager:抽象类AuthorizingSecurityManager支持使SecurityManager封装一个authorizer实例,把对权限验证的操作都委托给该实例
    springboot整合shiro 配置详解及原理分析_第9张图片

  • sesseionSecurityManager支持使SecurityManager封装一个sessionManager实例,把对session的操作都委托给该实例
    在这里插入图片描述

  • 最后是DefaultSecurityManager和DefaultWebSecurityManager,通过这个结构我们能发现,shiro提供给我们的默认的SecurityManager只有这两个,因此通常我们在配置文件中会加入默认该组件(怎么加入?为什么要加入?)。

最后我们再看一下这张图:
springboot整合shiro 配置详解及原理分析_第10张图片
通过这个图我们能发现,SecurityManager组件中的各个子组件都是我们刚才介绍的,那么我们大胆假设一下,既然SecurityManager已经有了默认的实现,还需要我们做什么?是不是只需要new 一个SecurityManager给他加入spring容器中就可以了呢?还是根据我们以往的经验猜测一下,是不是可以自定义认证器?授权器?session管理器?以及缓存管理器?大概率是可以的,那么怎么实现呢?我们查看一下例如CachingSecurityManager的源码就会发现,只需要替换其中的CacheManager 即可(关于为什么只需要替换CacheManager即可的原因,就需要了解spring或者springboot中关于缓存的管理)。

了解完上面这些我们大概对shiro的运行流程有了一点了解,那么接下来我们将shiro组件注册配置进springboot中,来实现认证及授权

ShiroConfig

写在前面的话:

springboot中集成shiro相对简单,只需要两个类:一个是shiroConfig类,一个是CustonRealm类。

ShiroConfig类:

顾名思义就是对shiro的一些配置,相对于之前的xml配置。包括:过滤的文件和权限,密码加密的算法,启用注解等相关功能。

CustomRealm类:

自定义的CustomRealm继承AuthorizingRealm。并且重写父类中的doGetAuthorizationInfo(权限相关)、doGetAuthenticationInfo(身份认证)这两个方法。

OK,下面我们从配置类开始介绍

shiroConfig

原理

在登录接口中传入username和password构建UsernamePasswordToken,然后调用subject的login方法,继而调用realm中的认证和授权

shiroConfig

自定义Realm

你可能感兴趣的:(shiro,jwt)