apache shiro jar包_Shiro框架原理及应用分析

6602c6a525056b85d71e8edbecc3bab9.png

shiro 介绍

Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。

学习shiro原因

  • 既然shiro将安全认证相关的功能抽取出来组成一个框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。
  • shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro。
  • java领域中spring security(原名Acegi)也是一个开源的权限管理框架,但是spring security依赖spring运行,而shiro就相对独立,最主要是因为shiro使用简单、灵活,所以现在越来越多的用户选择shiro。

Shiro架构

1a78e03901153b8f3e3ba23ce9ef4f30.png

概念解释

Subject

  • Subject即主体,外部应用与subject进行交互,subject记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序。
  • Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权

SecurityManager

  • SecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。
  • 通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。
  • SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口。

Authenticator

  • Authenticator即认证器,对用户身份进行认证
  • Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器

Authorizer

Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

realm

Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。

注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

sessionManager

sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

SessionDAO

SessionDAO即会话dao,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。

CacheManager

CacheManager即缓存管理,将用户权限数据存储在缓存,这样可以提高性能。

Cryptography

Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

shiro包

shiro-core是核心包必须选用,还提供了与web整合的shiro-web、与spring整合的shiro-spring、与任务调度quartz整合的shiro-quartz等

<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-quartz</artifactId>
<version>1.2.3</version>
</dependency>

也可以通过引入shiro-all包括shiro所有的包:

<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.2.3</version>
</dependency>

代码刨析

刨析后台管理经典框架Jeesite 使用Shiro的过程及原理分析

Jeesite框架源码都可以下载得到 有springboot版本 也有springcloud版本

http://jeesite.com/

刨析原则:

1、先刨析代码的每一个部分

2、再把所有的部分串联起来 组成一整条链 进而对shiro原理理解的更加透彻

ShiroConfig类

7fa191abf80572d9363cf632afd72306.png
1、创建一个 FilterRegistrationBean<Filter> 对象 ,该对象相当于一个list<String>集合  里面的每一个元素都是一道地铁安检门 门口又一个小姐姐 见到笑容满面过来的你 说:来者何人?让我来检查下你是否安全,能否进入地铁

2、从ShiroFilterFactoryBean工厂中获取所有的shirofilter过滤器 

3、规定对哪些”人“(url)进行“安检” 途中是对所有的路径都进行安检

fb30805266a54932b5099e661a23023f.png
这是定义了一个内部系统访问过滤器 具体内部逻辑我们待会再看

3fa539ad5d1ebeae0ef56e4ca499dc8e.png
这是定义了一个cas过滤器 并将给该过滤器指定了一个安全认证实现类 具体内部逻辑我们待会再看

4de7098c2981a1cc23c43b597aa804f3.png
这是一个表单登陆过滤器 并将指定了相应的安全认证实现类

ff6a720df3383cb9df9a368f3b0c2b9c.png
这是一个登出过滤器 并指定了安全认证实现类

ebdb86b15079420a99abdf68ecbd8585.png
这是一个字符串权限过滤器

f20bc2b6bb972f50eb2c720cee41e20d.png
角色权限过滤器

30a1ce0f2e9ffcb3960f60eef36f070f.png
用户权限过滤器

750a95e9c7b0d3ac3f4139b24b61ecf3.png
这是一个 shiro过滤器工厂

1、给该过滤器工厂设置安全管理员
2、设置登陆路径
3、设置登陆成功访问路径
4、把上面介绍的所有的过滤器都配置起来并设置过滤器标识
5、设置过滤链定义 在配置文件中配置的 具体看下

2b1d682191a358c30f33304acda5b230.png
比如 
/validCode = anon 表示 访问validCode接口 不做校验 

${adminPath}/file/** = user 表示 访问/file/** 的所有接口 走 user标识的过滤器 

${adminPath}/cms/* = perms[cms:view] 这个表示 访问  /cms/* 的所有接口 必须具备 cms:view 权限标示

52c0b7470d72ff18bf82298aef1475ab.png
给安全认证实现类AuthorizingRealm 设置 sessionDao

b1655ee50c6d6b7abadd0119f066dd1d.png
单点登陆时 退出时使用

56315eb56822146cbf0375d3b80cba03.png
安全认证实现类 CasAuthorizingRealm

设置 sessionDao、cas登出处理类、cas服务地址、cas服务回调地址

d2487992e27c467c5d14ff487605545b.png

98e088165b03316449d9b268e8540e36.png
定义shiro安全管理配置

1、创建 WebSecurityManager 对象 并做以下配置
2、将2个安全认证类增加到realm集合中 
3、定义自定义session监听事件
4、配置sessionManager、cacheManager
5、设置支持cas的subject工厂

02c7fc863f57e31b96b044f8d081ca59.png
shiro生命周期处理器 实现初始化和销毁回调

b07a2319685d33c3a020599374d9b835.png
过滤器代理配置

7715e1251b7db3d6f97343be357611af.png
启用注解方式aop拦截方法级权限检查

将上面所有的类串联起来

b7caff6592d4e832ec54dd172fba41b7.png

UserFilter 刨析

5c6a188f5ce3647b4a3d731c64b3d910.png
继承自shiro包中的UserFilter

权限字符串过滤器 PermissionsAuthorizationFilter 刨析

2678ea82795cf35e42984bd964baa9c9.png
继承自shiro包中的PermissionsAuthorizationFilter

302ee2a5d698c2e932099ff0c15b70c1.png

41fc0fc130be5141d19ca5da838f300b.png
知识点:Ajax默认是不支持重定向的,只局部刷新数据,不跳转页面

LogoutFilter 登出过滤器 源码刨析

继承了 LogoutFilter

b65362f7eec980c8d7ad8b692598a543.png

e9e712ff6a6616d11ffc6d8bc1522d92.png

23895c28274c976f1f4f5d1b95f86f81.png
获取重定向路径

InnerFilter 内部系统访问过滤器

a78c5a95b722f59d044474d102a74703.png
继承了 shiro的 AccessControlFilter

FormAuthenticationFilter 表单验证 包含验证码 过滤器

  继承 shiro包中的 FormAuthenticationFilter

25aa5e0b03e704a6bfb115498e89f50c.png

05d60f15f41d227369155fc0774f70b2.png

68b3a2fb8af546cca839e5c11af97077.png

f087bcf097ee442ba03827edbc2688de.png

8695c772d054bac607f858d0ffe20310.png

3d481ab7997c948d083ca741f6c47988.png

41697e2c604bff445d6188d87ad1a8cb.png

8f5a314173491b400598b4cfe80e214e.png

f83839f344b36f0bfd6d340221ffbdae.png

ee5e192200bfac37654170b6de8ffa74.png

129c94444df9443f9c4842a32fe0c70f.png

f7451a80aa2987d30e1758a4dce3dce2.png

d138a3958fa16fa1f12e1a43dcee8410.png

7f69d6b3bb2c11a26fac373f3f0d3009.png

CasAuthenticationFilter cas过滤器

继承 CasFilter

4abd7cf0d0f2ec02ee0af379cf7b08ac.png

851b878f499b3e9e459b6f8ef38384bf.png

ca95ce89b4e7f0f923499a20c2cd55c2.png

AuthorizingRealm 安全认证类

c425028c853baa952b889c037e18a967.png

10316e725807529b7200bc4657800ca7.png

fb9d70ed9831f9bb76b5c1b7d362baa5.png

20b884461480ea53f5b9b8f2558c5146.png

cda8ab22039a346f72cffc20cb773dd1.png

b3e7712298364618da8d4f0e446c36ca.png

CasAuthorizingRealm cas安全认证类

d0b12fb45cf93e26ea29860d4d9e8715.png

e28722debcc785d4542de5dcb35f96ab.png

a121915932eed90d5e295f14e022ae82.png

dbb6b4920cebc23f3a7e3ea93a29a3a3.png

6a89ab0eb27988a93dfe33c70e913b6e.png

单点登陆

365f86645e3b979bce8f2958e90ccf96.png
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值