百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Shiro框架原理及应用分析 shiro框架作用

yuyutoo 2024-10-21 12:03 10 浏览 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安全认证类

单点登陆

相关推荐

当 Linux 根分区 (/) 已满时如何释放空间?

根分区(/)是Linux文件系统的核心,包含操作系统核心文件、配置文件、日志文件、缓存和用户数据等。当根分区满载时,系统可能出现无法写入新文件、应用程序崩溃甚至无法启动的情况。常见原因包括:...

玩转 Linux 之:磁盘分区、挂载知多少?

今天来聊聊linux下磁盘分区、挂载的问题,篇幅所限,不会聊的太底层,纯当科普!!1、Linux分区简介1.1主分区vs扩展分区硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两...

Linux 文件搜索神器 find 实战详解,建议收藏

在Linux系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过200M文件,查看近7天系统中哪些文件被修改过,找出所有子目录中的可执行文件,这些任务需求...

Linux 操作系统磁盘操作(linux 磁盘命令)

一、文档介绍本文档描述Linux操作系统下多种场景下的磁盘操作情况。二、名词解释...

Win10新版19603推送:一键清理磁盘空间、首次集成Linux文件管理器

继上周四的Build19592后,微软今晨面向快速通道的Insider会员推送Windows10新预览版,操作系统版本号Build19603。除了一些常规修复,本次更新还带了不少新功能,一起来了...

Android 16允许Linux终端使用手机全部存储空间

IT之家4月20日消息,谷歌Pixel手机正朝着成为强大便携式计算设备的目标迈进。2025年3月的更新中,Linux终端应用的推出为这一转变奠定了重要基础。该应用允许兼容的安卓设备...

Linux 系统管理大容量磁盘(2TB+)操作指南

对于容量超过2TB的磁盘,传统MBR分区表的32位寻址机制存在限制(最大支持2.2TB)。需采用GPT(GUIDPartitionTable)分区方案,其支持64位寻址,理论上限为9.4ZB(9....

Linux 服务器上查看磁盘类型的方法

方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。...

ESXI7虚机上的Ubuntu Linux 22.04 LVM空间扩容操作记录

本人在实际的使用中经常遇到Vmware上安装的Linux虚机的LVM扩容情况,最终实现lv的扩容,大多数情况因为虚机都是有备用或者可停机的情况,一般情况下通过添加一块物理盘再加入vg,然后扩容lv来实...

5.4K Star很容易!Windows读取Linux磁盘格式工具

[开源日记],分享10k+Star的优质开源项目...

Linux 文件系统监控:用脚本自动化磁盘空间管理

在Linux系统中,文件系统监控是一项非常重要的任务,它可以帮助我们及时发现磁盘空间不足的问题,避免因磁盘满而导致的系统服务不可用。通过编写脚本自动化磁盘空间管理,我们可以更加高效地处理这一问题。下面...

Linux磁盘管理LVM实战(linux实验磁盘管理)

LVM(逻辑卷管理器,LogicalVolumeManager)是一种在Linux系统中用于灵活管理磁盘空间的技术,通过将物理磁盘抽象为逻辑卷,实现动态调整存储容量、跨磁盘扩展等功能。本章节...

Linux查看文件大小:`ls`和`du`为何结果不同?一文讲透原理!

Linux查看文件大小:ls和du为何结果不同?一文讲透原理!在Linux运维中,查看文件大小是日常高频操作。但你是否遇到过以下困惑?...

使用 df 命令检查服务器磁盘满了,但用 du 命令发现实际小于磁盘容量

在Linux系统中,管理员或开发者经常会遇到一个令人困惑的问题:使用...

Linux磁盘爆满紧急救援指南:5步清理释放50GB+小白也能轻松搞定

“服务器卡死?网站崩溃?当Linux系统弹出‘Nospaceleft’的红色警报,别慌!本文手把手教你从‘删库到跑路’进阶为‘磁盘清理大师’,5个关键步骤+30条救命命令,快速释放磁盘空间,拯救你...

取消回复欢迎 发表评论: