Shiro框架原理及应用分析 shiro框架作用
yuyutoo 2024-10-21 12:03 1 浏览 0 评论
shiro 介绍
Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。
学习shiro原因
- 既然shiro将安全认证相关的功能抽取出来组成一个框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。
- shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro。
- java领域中spring security(原名Acegi)也是一个开源的权限管理框架,但是spring security依赖spring运行,而shiro就相对独立,最主要是因为shiro使用简单、灵活,所以现在越来越多的用户选择shiro。
Shiro架构
概念解释
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类
1、创建一个 FilterRegistrationBean<Filter> 对象 ,该对象相当于一个list<String>集合 里面的每一个元素都是一道地铁安检门 门口又一个小姐姐 见到笑容满面过来的你 说:来者何人?让我来检查下你是否安全,能否进入地铁
2、从ShiroFilterFactoryBean工厂中获取所有的shirofilter过滤器
3、规定对哪些”人“(url)进行“安检” 途中是对所有的路径都进行安检
这是定义了一个内部系统访问过滤器 具体内部逻辑我们待会再看
这是定义了一个cas过滤器 并将给该过滤器指定了一个安全认证实现类 具体内部逻辑我们待会再看
这是一个表单登陆过滤器 并将指定了相应的安全认证实现类
这是一个登出过滤器 并指定了安全认证实现类
这是一个字符串权限过滤器
角色权限过滤器
用户权限过滤器
这是一个 shiro过滤器工厂
1、给该过滤器工厂设置安全管理员2、设置登陆路径3、设置登陆成功访问路径4、把上面介绍的所有的过滤器都配置起来并设置过滤器标识5、设置过滤链定义 在配置文件中配置的 具体看下
比如 /validCode = anon 表示 访问validCode接口 不做校验
${adminPath}/file/** = user 表示 访问/file/** 的所有接口 走 user标识的过滤器
${adminPath}/cms/* = perms[cms:view] 这个表示 访问 /cms/* 的所有接口 必须具备 cms:view 权限标示
给安全认证实现类AuthorizingRealm 设置 sessionDao
单点登陆时 退出时使用
安全认证实现类 CasAuthorizingRealm
设置 sessionDao、cas登出处理类、cas服务地址、cas服务回调地址
定义shiro安全管理配置
1、创建 WebSecurityManager 对象 并做以下配置2、将2个安全认证类增加到realm集合中 3、定义自定义session监听事件4、配置sessionManager、cacheManager5、设置支持cas的subject工厂
shiro生命周期处理器 实现初始化和销毁回调
过滤器代理配置
启用注解方式aop拦截方法级权限检查
将上面所有的类串联起来
UserFilter 刨析
继承自shiro包中的UserFilter
权限字符串过滤器 PermissionsAuthorizationFilter 刨析
继承自shiro包中的PermissionsAuthorizationFilter
知识点:Ajax默认是不支持重定向的,只局部刷新数据,不跳转页面
LogoutFilter 登出过滤器 源码刨析
继承了 LogoutFilter
获取重定向路径
InnerFilter 内部系统访问过滤器
继承了 shiro的 AccessControlFilter
FormAuthenticationFilter 表单验证 包含验证码 过滤器
继承 shiro包中的 FormAuthenticationFilter
CasAuthenticationFilter cas过滤器
继承 CasFilter
AuthorizingRealm 安全认证类
CasAuthorizingRealm cas安全认证类
‘
单点登陆
相关推荐
- 史上最全的浏览器兼容性问题和解决方案
-
微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...
-
- 平面设计基础知识_平面设计基础知识实验收获与总结
-
CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...
-
2025-02-21 16:01 yuyutoo
- 写作排版简单三步就行-工具篇_作文排版模板
-
和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...
- 写一个2048的游戏_2048小游戏功能实现
-
1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...
- 今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……
-
最近的天气暖和得让很多小伙伴们喊“热”!!! 昨天的气温到底升得有多高呢?你家有没有榜上有名?...
- CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式
-
之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...
- 你的自我界限够强大吗?_你的自我界限够强大吗英文
-
我的结果:A、该设立新的界限...
- 行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?
-
行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...
-
- 让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
-
去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...
-
2025-02-21 16:00 yuyutoo
- 今年国家综合性消防救援队伍计划招录消防员15000名
-
记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...
- 一起盘点最新 Chrome v133 的5大主流特性 ?
-
1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...
- 竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使
-
style="text-align:center;"data-mce-style="text-align:...
- 学物理能做什么?_学物理能做什么 卢昌海
-
作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...
-
- 你不知道的关于这只眯眼兔的6个小秘密
-
在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...
-
2025-02-21 16:00 yuyutoo
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)