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);

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Python3的数据结构与算法 - 01 复杂度和列表查找

一、时间复杂度 定义:用来评估算法运行效率的一个式子。 例如:此处的O(1) 详单与一个时间单位 接下来我们看下面两个式子: 如果按照上面的定义,那么打印三次相当O(3),下面的循环相当于O(n21) 但是实际不是这样的 因…

KUKA库卡机器人编程语言是什么?

KUKA库卡机器人的编程语言主要是KUKA Robot Language(简称KRL)。KRL是库卡机器人专门为其机器人系统设计的编程语言,用于编写和控制KUKA工业机器人的运动和操作。KRL结合了指令式编程和结构化编程的特点,具有一定的易学性和灵活性…

软考29-上午题-排序

一、排序的基本概念 1-1、稳定性 稳定性指的是相同的数据所在的位置经过排序后是否发生变化。若是排序后,次序不变,则是稳定的。 1-2、归位 每一趟排序能确定一个元素的最终位置。 1-3、内部排序 排序记录全部存放在内存中进行排序的过程。 1-4、外部…

微信小程序之开发会议OA项目

目录 前言 本篇目标 首页 会议 投票 个人中心 会议OA项目-首页 配置 tabbar mock工具 page swiper 会议信息 会议OA项目-会议 自定义tabs组件 会议管理 会议OA项目-投票 会议OA项目-个人中心 前言 文章含源码资源,投票及个人中心详细自行查看…

【Python如何求出斐波那契数列】

1、斐波那契python代码如下: # python如何求斐波那契数列 def fib(num): # 用来求出第num个的斐波那契数列的值if num 0 or num 1:return 1else:num fib(num - 1) fib(num - 2)return num def fiblist(n): # 用来求出前n个值的斐波那契数列fb_list []for i …

单向/双向V2G环境下分布式电源与电动汽车充电站联合配置方法(matlab代码)

目录 1 主要内容 目标函数 电动汽车负荷建模 算例系统图 程序亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现博士文章《互动环境下分布式电源与电动汽车充电站的优化配置方法研究》第五章《单向/双向V2G环境下分布式电源与电动汽车充电站联合配置方法》…

PMBus > SMBus > I2C 关系解析

一、SMBUS SMBus 全称 System Management Bus,即系统管理总线。一种基于I2C而扩展出来的协议,是 I2C 协议的一个子集。但SMBus 要求更严格,规定了更多细节与规范。有一些更为复杂的操作,但是原理都还是基于I2C。 SMBus 为系统和电…

05.QT坐标系

1. 坐标系原点 坐标系原点就是屏幕/窗口的左上角,X向右增长,Y向下增长。 2.设置控件位置 设置控件位置,就相当于是需要指定控件的坐标,对于该控件来说,其坐标原点是其父窗口/父控件的左上角。 设置方法就是通过控件的…

8.可观测性

可观测性 readinessProbe 就绪探针 Pod生命周期有几个不同阶段,Pod会有不同的状态。 刚创建Pod时,Pod处于Pending状态。调度程序会尝试找出放置Pod的位置。如果调度程序找不到要放置Pod的节点,它将保持Pending状态。 运行kubectl describe po…

【DBeaver+mysql】如何在DBeaver中创建mysql服务的连接并新建数据库

一、创建步骤 1、下载安装mysql 8.0(注意,安装过程会启动mysql服务,这才是能用命令行执行node处理sql语句的关键) 下载地址:https://dev.mysql.com/downloads/file/?id526407 2、下载安装DBeaver数据库管理IDE 3、在…

循环队列|超详细|数据结构学习讲解与笔记

队列元素先进先出队列只允许在线性表的一端进行操作,是一种操作受限的线性表 队列的基本操作 InItQueue(&Q)初始化队列,构造一个空队列 QEmptyQueue(Q)队列判空FullQueue(Q)队列判满EnQueue(&Q , x)入队操作DeQueue(&Q , &x)出队操作G…

铌酸锂芯片与精密划片机:科技突破引领半导体制造新潮流

在当今快速发展的半导体行业中,一种结合了铌酸锂芯片与精密划片机的创新技术正在崭露头角。这种技术不仅引领着半导体制造领域的进步,更为其他产业带来了前所未有的变革。 铌酸锂芯片是一种新型的微电子芯片,它使用铌酸锂作为基底材料&#x…

HTTP/1.1 如何优化?

问你一句:「你知道 HTTP/1.1 该如何优化吗?」 我们可以从下面这三种优化思路来优化 HTTP/1.1 协议: 尽量避免发送 HTTP 请求在需要发送 HTTP 请求时,考虑如何减少请求次数减少服务器的 HTTP 响应的数据大小 下面,就针对这三种思路具体看看有哪些优化…

【代码移植】UNIX/Linux/POSIX代码程序移植到Windows系统平台技术汇总与经验分享

​ 图片来源 UNIX (Linux) to Windows代码移植技术路线 MinGW MinGW/MinGW-W64是用Windows原生系统API实现的,在Windows上运行的GCC编译工具链,可以编译出Windows原生应用程序。 MinGW编译工具链的生态位和微软官方的MSVC类似。 优点 MinGW编译出…

(每日持续更新)jdk api之ObjectInputValidation基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿&…

fish终端下conda activate失败

【问题】fish终端下激活conda环境报错: >> conda activate base CondaError: Run conda init before conda activate ## 然而运行 conda init fish 仍旧无法解决【解决】 参考:https://github.com/conda/conda/issues/11079 方法一&#xf…

SQL-Labs靶场“1-5”关通关教程

君衍. 一、准备工作二、第一关 基于GET单引号字符型注入1、源码分析2、联合查询注入过程 三、第二关 基于GET整型注入1、源码分析2、联合查询注入过程 四、第三关 基于GET单引号变形注入1、源码分析2、联合查询注入过程 五、第四关 基于GET双引号字符型注入1、源码分析2、联合查…

JDBC核心技术

第1章 JDBC概述 第2章 获取数据库连接 第3章 使用PreparedStatement实现CRUD操作 第4章 操作BLOB类型字段 第5章 批量插入 第6章 数据库事务 第7章 DAO及相关实现类 第8章 数据库连接池 第9章 Apache-DBUtils实现CRUD操作图像 小部件

提高供应商收发文件效率的同时,如何保障数据的安全流转?

数据文件是制造业企业的核心竞争力,一旦发生数据外泄,就会给企业造成经济损失。之前就出现过像小米二级供应商因对其下游供应商管理不善,泄露了小米汽车前后保险杠的早期设计稿事件。制造业企业与供应商之间业务联系紧密,文件流转…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(二)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型,由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”(そら sora),即天空之意,以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…