Shiro-04-shiro 详细架构

详细架构

下图显示了Shiro的核心架构概念,并简要概述了每个架构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面我们对除了核心组件的部分做一下简单的介绍:

Authentication(身份验证)

身份验证是验证用户身份的过程。

也就是说,当用户通过应用程序进行身份验证时,他们在证明自己实际上就是他们所说的身份。有时也称为“登录”。

这通常是一个三步过程。

  1. 收集用户的识别信息(称为主体)和支持身份证明的凭据(称为凭据)。

  2. 将主体和凭据提交到系统。

  3. 如果提交的凭据与系统对该用户身份(本金)的期望匹配,则认为该用户已通过身份验证。如果不匹配,则认为该用户未通过身份验证。

每个人都熟悉的此过程的一个常见示例是用户名/密码组合。当大多数用户登录软件应用程序时,通常会提供其用户名(主体)和支持密码(凭据)。如果存储在系统中的密码(或密码表示形式)与用户指定的密码匹配,则认为它们已通过身份验证。

Shiro以简单直观的方式支持相同的工作流程。

正如我们所说,Shiro具有以主题为中心的API-在运行时,您与Shiro所做的几乎所有事情都是通过与当前正在执行的Subject进行交互来实现的。

因此,要登录主题,您只需调用其登录方法,并传递一个AuthenticationToken实例,该实例代表所提交的主体和凭据(在本例中为用户名和密码)。

此示例在下面的清单5中显示。

  • 列表5 主题登录
//1. Acquire submitted principals and credentials:
AuthenticationToken token =
new UsernamePasswordToken(username, password);//2. Get the current Subject:
Subject currentUser = SecurityUtils.getSubject();//3. Login:
currentUser.login(token);

如您所见,Shiro的API可以轻松反映常见的工作流程。

您会继续将这种简单性视为主题操作的所有操作的主题。

当调用登录方法时,SecurityManager将接收AuthenticationToken并将其分发给一个或多个配置的领域,以允许每个领域根据需要执行身份验证检查。

每个领域都可以根据需要对提交的AuthenticationToken做出反应。

但是,如果登录尝试失败会怎样?

如果用户指定了错误的密码怎么办?

您可以通过对Shiro的运行时AuthenticationException做出反应来处理故障,如清单6所示。

  • 列表6-处理失败的场景
//3. Login:
try {currentUser.login(token);
} catch (IncorrectCredentialsException ice) {} catch (LockedAccountException lae) {}catch (AuthenticationException ae) {} 

您可以选择捕获AuthenticationException子类之一并作出具体反应,或者一般性地处理任何AuthenticationException(例如,向用户显示通用的“用户名或密码错误”消息)。

选择取决于您,具体取决于您的应用程序需求。

主题成功登录后,它们被认为已通过身份验证,通常您允许他们使用您的应用程序。

但是,仅仅因为用户证明了自己的身份并不意味着他们可以在应用程序中做任何想做的事情。

这就引出了下一个问题:“如何控制允许用户执行或不执行的操作?” 确定允许用户执行的操作称为授权。

接下来,我们将介绍Shiro如何启用授权。

Authorization(授权)

授权本质上是访问控制-控制用户可以在应用程序中访问的内容(例如资源,网页等)。

大多数用户通过使用角色和权限等概念来执行访问控制。

也就是说,通常根据分配给他们的角色和/或权限,允许用户执行某项操作或不执行某项操作。

然后,您的应用程序可以根据对这些角色和权限的检查来控制公开哪些功能。

如您所料,主题API使您可以非常轻松地执行角色和权限检查。

例如,清单7中的代码片段显示了如何检查Subject是否被分配了特定角色。

  • 清单7-角色检查
if ( subject.hasRole("administrator") ) {//show the ‘Create User’ button
} else {//grey-out the button?
} 

如您所见,您的应用程序可以基于访问控制检查来启用或禁用功能。

权限检查是执行授权的另一种方法。

如上例所示,检查角色存在一个重大缺陷:您无法在运行时添加或删除角色。您的代码使用角色名称进行了硬编码,因此,如果更改了角色名称和/或配置,则代码将被破坏!如果您需要能够在运行时更改角色的含义,或者根据需要添加或删除角色,则必须依靠其他方式。

为此,Shiro支持其权限概念。

权限是对功能的原始说明,例如“开门”,“创建博客条目”,“删除’jsmith’用户”等。

通过使权限反映您的应用程序的原始功能,您只需更改权限检查何时更改应用程序的功能。反过来,您可以在运行时根据需要向角色或用户分配权限。

作为一个示例,如下面的清单8所示,我们可以重写之前的角色检查,而使用权限检查。

  • 清单8-权限检测
if (subject.isPermitted("user:create") ) {//show the ‘Create User’ button
} else {//grey-out the button?
} 

这样,分配了 user:create 权限的任何角色或用户都可以单击“Create User”按钮,并且这些角色和分配甚至可以在运行时更改,从而为您提供了非常灵活的安全模型。

“usercreate”字符串是遵循某些解析约定的权限字符串的示例。

Shiro的WildcardPermission支持此约定。

尽管不在本介绍文章的讨论范围之内,但您会发现WildcardPermission在创建安全策略时可以非常灵活,甚至还支持实例级访问控制之类的功能。

  • 清单9-实例级别权限校验
if ( subject.isPermitted(“user:delete:jsmith”) ) {//delete the ‘jsmith’ user
} else {//don’t delete ‘jsmith’
}

此示例表明,如果需要,您可以控制甚至访问非常细致的实例级别。

如果愿意,您甚至可以发明自己的权限语法。

有关更多信息,请参见 Shiro权限文档。

最后,与身份验证一样,上述调用最终也进入了SecurityManager,后者将咨询一个或多个Realms来做出访问控制决策。 这使领域可以根据需要响应身份验证和授权操作。

这就是Shiro授权功能的简要概述。

尽管大多数安全框架都停止了身份验证和授权,但Shiro提供了更多功能。

接下来,我们将讨论Shiro的高级会话管理功能。

会话管理

Apache Shiro在安全框架领域提供了一些独特的功能:可在任何应用程序和任何体系结构层中使用的一致的Session API。

也就是说,Shiro为任何应用程序启用了会话编程范例-从小型守护程序独立应用程序到最大的群集Web应用程序。

这意味着希望使用会话的应用程序开发人员不再需要,则不再需要使用Servlet或EJB容器。或者,如果使用这些容器,则开发人员现在可以选择在任何层中使用统一且一致的会话API,而不是使用servlet或EJB特定的机制。

但是Shiro会话的最重要好处之一就是它们与容器无关。

这具有微妙但极其强大的含义。

例如,让我们考虑会话集群。有多少种特定于容器的方式可以将会话群集在一起以实现容错和故障转移?

Tomcat与Jetty的功能不同,而Jetty与Websphere的功能不同。但是,通过Shiro会话,您可以获得独立于容器的集群解决方案。

Shiro的体系结构允许可插入的Session数据存储,例如企业缓存,关系数据库,NoSQL系统等等。

这意味着您只需配置一次会话集群,无论部署环境如何(Tomcat,Jetty,JEE Server或独立应用程序),它都将以相同的方式工作。

无需根据部署应用程序的方式重新配置应用程序。

Shiro会话的另一个好处是,如果需要,会话数据可以跨客户端技术共享

例如,如果需要,Swing桌面客户端可以参加相同的Web应用程序会话-如果最终用户同时使用这两个客户端,则很有用。

那么,您如何在任何环境中访问主题的会话?

如下面的示例所示,有两种Subject方法。

  • Listing 10. Subject’s Session
Session session = subject.getSession();
Session session = subject.getSession(boolean create);

如您所见,这些方法在概念上与HttpServletRequest API相同。

第一种方法将返回主题的现有会话,或者如果没有,则创建一个新的会话并返回。

第二种方法接受一个布尔参数,该参数确定是否将创建一个新的会话(如果尚不存在)。

获取主题的会话后,就可以将其几乎与HttpSession一样使用。

Shiro团队认为HttpSession API最适合Java开发人员,因此我们保留了大部分感觉。

当然,最大的区别是您可以在任何应用程序中使用Shiro Sessions,而不仅仅是Web应用程序。

清单11显示了这种熟悉程度。

  • Listing 11. Session methods
Session session = subject.getSession();
session.getAttribute("key", someValue);
Date start = session.getStartTimestamp();
Date timestamp = session.getLastAccessTime();
session.setTimeout(millis);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基于微信小程序的乐室预约小程序,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

Apache Apisix网关系统历史漏洞复现分析

文章目录 前言CVE-2020-13945默认api令牌CVE-2021-45232未授权接口2.1 默认账户密码导致RCE2.2 未授权访问api接口RCE CVE-2022-24112 地址限制绕过CVE-2022-29266 JWT令牌伪造4.1 漏洞源码简析与修复4.2 漏洞环境搭建与复现 总结 前言 Apache APISIX 是一个动态、实时、高性能…

沁恒CH32V30X学习笔记02--GPIO的使用教程及2次封装驱动

gpio 概述 刚复位后,GPIO 口运行在初始状态,这时大多数 IO 口都是运行在浮空输入状态 外部中断 所有的 GPIO 口都可以被配置外部中断输入通道,但一个外部中断输入通道最多只能映射到一个 GPIO 引脚上,且外部中断通道的序号必须和 GPIO 端口的位号一致,比如 PA1(或 PB1、…

Android开机不显示bootloader界面

Turn it off in the following way LINUX\android\bootable\bootloader\edk2\QcomModulePkg\Library\BootLib\MenuKeysDetection.c 试了没有生效 --- a/QcomModulePkg/Library/BootLib/MenuKeysDetection.cb/QcomModulePkg/Library/BootLib/MenuKeysDetection.c-364,7 364,8…

[Flask]SSTI1 buuctf

声明:本篇文章csdn要我一天发两篇所以我来水的 跟ssti注入的详细知识我这里写了 https://blog.csdn.net/weixin_74790320/article/details/136154130 上面链接我复现了vulhub的SSTI,其实本质上是一道题 然后我们就用{{.__class__}}看类的类型&#xf…

css2的三大特性

css的三大特性 一.层叠性概念 二.继承性行高的继承 三. 优先级概念a标签默认蓝色继承注意事项 一.层叠性 概念 二.继承性 行高的继承 可用倍数表示三. 优先级 概念 a标签默认蓝色 继承注意事项 例子

单反sd卡照片突然没有了?原因+解决方案

在使用单反相机拍摄时,SD卡作为存储媒介,承担着存储照片的重要角色。然而,有时候我们会遇到SD卡中的照片突然消失的情况,给拍摄工作带来很大的困扰。本文将深入剖析导致这一问题的原因,并提供相应的解决方案&#xff0…

Visual Studio Code安装Oracle SQL Developer插件

Visual Studio Code,简称VS Code,是最流行的IDE之一。SQL Developer作为面向 Oracle 数据库专业人员的查询、开发和管理工具,现已可作为插件(Extension)在VS Code中安装。无需安装 Java, .NET, 和Oracle Client 。 数…

【代码整理】Pytorch从0实现图像分类pipeline

文章目录 引言1.数据集读取部分dataloader.py1.1.分类数据集的数据组织形式1.2自定义数据增强/数据预处理类1.3.重写torch.utils.data.Dataset数据集读取类1.4.模块测试样例 2.网络部分mynet.py2.1.自定义分类网络torch.nn.Module2.2.模块测试样例 3.训练/验证/测试模块runner.…

嵌入式第十七天!(文件IO)

文件IO: 标准IO和文件IO的区别: 1. 标准IO是库函数,是对系统调用的封装 2. 文件IO是系统调用,是Linux内核中的函数接口 3. 标准IO是有缓存的 4. 文件IO是没有缓存的 1. 操作步骤: 打开 -> 读/写 -> 关闭 2. 打开…

基于Java SSM框架实现精准扶贫管理系统项目【项目源码】

基于java的SSM框架实现精准扶贫管理系统演示 JSP技术介绍 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了用户的需…

⭐北邮复试刷题LCR 012. 寻找数组的中心下标__前缀和思想 (力扣119经典题变种挑战)

LCR 012. 寻找数组的中心下标 给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为…

数据管理关键技术顶层设计

数据管理关键技术顶层设计 明仔 数据思考笔记 2023-12-27 07:36 广东 数据思考笔记 专注于数据架构,数据中台,数据治理的相关分享,寻求数据与业务的结合点。 13篇原创内容 公众号 数据治理65 数据治理 目录 上一篇企业数据资产管理解…

基于Java SSM框架实现生鲜食品o2o商城系统项目【项目源码+论文说明】

基于java的SSM框架实现生鲜食品o2o商城系统演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 生鲜食品o2o商城系统,主要的模块包括查看管理员;首页、个人中心、用户…

Tomcat版本号泄露

1.问题描述 Tomcat报错页面泄漏Apache Tomcat/7.0.92相关版本号信息,是攻击者攻击的途径之一。因此实际当中建议去掉版本号信息。 2.测试过程 随便访问一个tomcat不存在的界面 http://127.0.0.1:8080/examples/mytest.jsp 3.解决办法 1.进入到tomcat/lib目录下&a…

预检请求:为跨域请求保驾护航(下)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

svg图片构造QGraphicsSvgItem对象耗时很长的问题解决

目录 1. 问题的提出 2. 问题解决 1. 问题的提出 今天通过一张像素为141 * 214,大小为426KB的svg格式的图片构造QGraphicsSvgItem对象,再通过Qt的Graphics View Framework框架,将QGraphicsSvgItem对象显示到场景视图上,代码如下&…

【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II

LeetCode685. 冗余连接 II 在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。 输入一个有向图,该图由…

离线数仓(二)【用户行为日志采集平台搭建】

用户行为日志采集平台搭建 1、用户行为日志概述 用户行为日志的内容,主要包括用户的各项行为信息以及行为所处的环境信息。收集这些信息的主要目的是优化产品和为各项分析统计指标提供数据支撑。收集这些信息的手段通常为埋点。 目前主流的埋点方式,有代…

CleanMyMacX需要付费吗?多少钱?有哪些新功能

CleanMyMac X是一个付费应用程序**,需要许可证或订阅来解锁所有功能。不过,CleanMyMac X提供免费试用版供您访问其有限的功能。在试用模式下,用户可以使用部分功能进行体验,但这并非完全免费,因为某些功能会受到限制。…