序言
前面我们学习了如下内容:
5 分钟入门 shiro 安全框架实战笔记
shiro 安全框架入门,看这一篇就够了
相信大家对于 shiro 已经有了最基本的认识,这一节我们一起来学习写如何将 shiro 与 spring 进行整合。
spring 整合
maven 依赖
服务类定义
定义一个简单的服务类,用于演示 注解的权限校验。
快速开始
我们对原来的 Quick Start 进行改造如下:
这里最核心的区别是 是直接通过 注入得到的。
也没有看到我们以前初始化 SecurityManager 的 ini 文件,这些在下面的配置文件中。
配置类
这里通过 的方式声明了用户角色等信息,可以简单理解为和 Ini 文件初始化是等价的。
导入了 3 个配置类,我们后面进行介绍。
启动
spring 应用的启动:
ShiroBeanConfiguration 配置类
共计导入了 3 个配置类,我们接下来逐一分析下这 3 个配置类。
源码
这 3 个方法都是继承自父类,直接调用的父类方法。
AbstractShiroBeanConfiguration.java
实际上这里初始化了 3 个对象:LifecycleBeanPostProcessor/DefaultEventBus/ShiroEventBusBeanPostProcessor。
LifecycleBeanPostProcessor
这个类实际上比较简单,主要做了 2 件事情。
(1)执行 init() 和 destory()。
(2)指定对应的优先级,默认为最低。
核心部分如下:
init 初始化
destory 销毁
DefaultEventBus
这个类如其名,就是默认的事件总线类。
接口的如下:
分别对应的是事件的发布,注册和取消注册。
实现部分实际就是调用对应的 EventListener 类,并且通过读写锁保证并发安全,暂时不做展开。
ShiroEventBusBeanPostProcessor
这个类实际上是配合 EventBus 使用的,核心实现如下:
这里会把实现了 EventBusAware 接口,和指定了 注解的对象,注解对应的 eventbus。
ShiroConfiguration 配置
思考
我们 QuickStart 中自动注入了 对象,这个对象是在哪里初始化的呢?
核心源码
核心部分如下:
这里可以发现实际上已经导入了 ShiroBeanConfiguration 配置类,所以官方的 demo 可以简化如下:
实际测试了一下,也是通过的。
SecurityManager 初始化
我简单的看了下 SecurityManager 实现子类还是比较多得。断点可以发现默认的类型是 。
这些都可以在 类中找到答案。
AbstractShiroConfiguration.java
核心实现如下:
方法会把我们 CliApp 中定义的 Realm 对象当作参数传入。
createSecurityManager() 方法就会初始化 对象。
ShiroAnnotationProcessorConfiguration 配置
思考
我们在 SampleService 中使用了注解 ,就可以校验对应的权限了。
但是这一切是如何被自动实现的呢?
源码
本身没有什么源码,主要看下父类。
AbstractShiroAnnotationProcessorConfiguration
是 spring 中的自动代理实现类,此处不做展开。
我们重点看一下 对象:
AuthorizationAttributeSourceAdvisor
这里主要做了两件事:
(1)设置对应的 securityManager
(2)处理有 等 shiro 的内置注解的方法。
AopAllianceAnnotationsAuthorizingMethodInterceptor
这个名字起的,好家伙,真长。
这里就是对于注解的响应方法 aop 拦截器实现。
到这里实际上就比较简单了,相信聪明如你一定已经知道整个 spring-shiro 面纱背后的秘密了。
我们直接看一下 的实现。
PermissionAnnotationMethodInterceptor
处理类实现如下:
小结
这一节我们讲解了如何整合 spring 与 shiro,下一节我们将实战整合 springboot 与 shiro,感兴趣的小伙伴可以关注一波不迷路。
为了便于大家学习,所有源码都已开源:
https://gitee.com/houbinbin/shiro-inaction/tree/master/shiro-inaction-02-springalone
希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。
我是老马,期待与你的下次相遇。
领取专属 10元无门槛券
私享最新 技术干货