Shiro-04-shiro 详细架构

news2025/1/19 14:32:43

详细架构

下图显示了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.coloradmin.cn/o/1455415.html

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

相关文章

相机图像质量研究(32)常见问题总结:图像处理对成像的影响--振铃效应

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

VMware Ubuntu 无网卡驱动怎么办?

网上拷了一个VMware的Ubuntu系统,结果网络没法连接。 ifconfig命令一看,只有lo的本地回环网卡,没有真实网卡驱动。 很简单,一下三步就可以搞定。 首先,iplink show查看本地所有网卡。 我这里出现了一个ens33的网卡…

深度学习-分类任务---经典网络

文章目录 经典网络1 LeNet51.1 模型结构1.2 模型结构1.3 模型特性 2 AlexNet2.1 模型介绍2.2 模型结构2.3 模型解读2.4 模型特性 3 可视化ZFNet-转置卷积3.1 基本的思想及其过程3.2 卷积与转置卷积3.3 卷积可视化3.4 ZFNet和AlexNet比较 4 VGGNet4.1 模型结构4.2 模型特点 5 Ne…

21-k8s中pod的调度-污点和污点容忍

一、污点的概念 所谓的污点,就是给k8s集群中的节点设置的污点,通过设置污点,来规划资源创建时所在的节点; 污点的类型解释说明PreferNoshedule 节点设置这个五点类型后; 表示,该节点接受调度,但…

NLP深入学习:《A Survey of Large Language Models》详细学习(七)

文章目录 1. 前言2. 应用场景2.1 LLMs 对研究界的应用2.1.1 经典 NLP 任务2.1.2 信息检索2.1.3 推荐系统2.1.4 多模态大语言模型2.1.5 知识图谱增强型 LLM2.1.6 基于 LLM 的智能体2.1.7 用于评估 2.2 特定领域的应用 3. 参考 1. 前言 这是《A Survey of Large Language Models…

51_蓝桥杯_数码管静态显示

一 电路 二 数码管静态显示工作原理 三 代码 代码1 实现第一个数码管显示数字6的功能 #include "reg52.h"unsigned char code SMG_Duanma[18] {0xc0,0xf9.0xa4,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc0,0x86,0x8e,0xbf,0x7f};void Delay(unsignde int t) {wh…

在ubuntu中制作ubuntu的U盘启动盘

概要: 本篇演示在ubuntu22.04中制作ubuntu22.04的U盘启动盘 一、下载ubuntu22.04的iso文件 访问ubuntu官网https://ubuntu.com自行下载ubuntu官网 二、制作U盘启动盘 打开系统自带软件Startup Disk Creator 软件会自动检测iso文件和U盘 点击Make Startup Disk…

从源代码安装 rocSOLVER 并 调试 rocSOLVER 在 Ubuntu 22.04 平台

0, 下载并编译 rocBLAS 的调试版本 sudo apt install python3.10-venv sudo apt install libmsgpack-dev sudo pip install joblibgit clone --recursive https://github.com/ROCm/rocBLAS.git $ cd rocBLAS/ $ ./install.sh -i -g构建时间也不短 1,下载并编译 roc…

17.Qt 单选框相关操作

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 1. 布置界面 2.管理 3.槽函数 参考&#xff1a; 前言&#xff1a; 组合选择只能选择一个的单选框实现&#xff0c;以及管理组合单选框 技能&#xff1a; <QRadioButton> <QButtonGroup> 内容&…

openGauss学习笔记-223 openGauss性能调优-系统调优-数据库系统参数调优-数据库内存参数调优

文章目录 openGauss学习笔记-223 openGauss性能调优-系统调优-数据库系统参数调优-数据库内存参数调优223.1 逻辑内存管理参数223.2 执行算子是否下盘的参数 openGauss学习笔记-223 openGauss性能调优-系统调优-数据库系统参数调优-数据库内存参数调优 数据库的复杂查询语句性…

RIP协议详解

​RIP是最早的动态路由协议&#xff0c;虽然已经过时并且很少使用&#xff0c;但是可以通过学习RIP并且和ospf等现在正在使用的路由协议对比&#xff0c;了解其工作原理和过时原因&#xff0c;具有很强的学习性。 一、RIP协议简介 RIP&#xff08;Routing Information Protoc…

【数据仓库】主题域和数据域

数据域与主题域区别 https://www.cnblogs.com/datadance/p/16898254.html 数据域是自下而上&#xff0c;以业务数据视角来划分数据&#xff0c;一般进行完业务系统数据调研之后就可以进行数据域的划分。针对公共明细层&#xff08;DWD&#xff09;进行主题划分。主题域则自上而…

spark sql官网优化指南

两句话概括 缓存数据调整参数 缓存数据 把数据缓存到内存,spark sql能够只扫描需要列并且会自动压缩数据,占用最小的内存和减小GC压力。这无需多言,内存远远要快于磁盘,spark效率比hive高这个就是一个主要原因。 缓存数据代码spark.catalog.cacheTable("tableName&qu…

【ArcGIS微课1000例】0103:导出点、线、面要素的折点坐标值

点要素对应的是一个或者若干个坐标,线要素对应的是对个坐标值对应的点连起来,面要素是多个坐标值对应的点连起来构成的封闭多边形。本文讲述导出点的坐标值。 文章目录 一、点要素坐标导出1. 计算点坐标2. 导出点坐标二、线要素坐标导出1. 生成线要素折点2. 计算折点坐标3. 导…

腾讯云4核8G12M服务器支持多少人在线?

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

Github:分享一款开源的跨平台多功能远程控制和监控工具Spark

目录 1、设备列表及操作列表 2、登录机器 Shell 执行命令 3、桌面远程访问 4、远程设备的进程管理 5、远程设备文件管理 今天要给大家推荐一个开源的跨平台多功能远程控制和监控工具&#xff1a;Spark。 目前该项目处于不维护状态&#xff0c;大家可以自己根据需要进行扩…

Eclipse - Code Templates

Eclipse - Code Templates References Window -> Preferences -> C/C -> Code Style -> Code Templates 配置默认代码模板&#xff0c;可以点击 Export 将自己配置好的 Code Templates 导出去&#xff0c;以便备份和共享。 References [1] Yongqiang Cheng, https…

【软考高级信息系统项目管理师--第十一章:项目成本管理】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;软考高级–信息系统项目管理师 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 第十一章&#xff1a;项目成本管理 成本管理的过程规划成本管理估算成本制定预算控…

【JavaEE】_HTTP请求首行

目录 1. URL 2. 方法 2.1 GET方法 2.2 POST方法 2.3 GET与POST的区别 2.4 低频使用方法 1. URL 在mysql JDBC中已经提到过URL的相关概念&#xff1a; 如需查看有关JDBC更多内容&#xff0c;原文链接如下&#xff1a; 【MySQL】_JDBC编程-CSDN博客 URL用于描述某个资源…

代码检测规范和git提交规范

摘要&#xff1a;之前开发的项目&#xff0c;代码检测和提交规范都是已经配置好的&#xff0c;最近自己新建的项目就记录下相关配置过程。 1. ESlint配置 2013年6月创建开源项目&#xff0c;提供一个插件化的JavaScript代码检测工具&#xff0c;创建项目是生成的eslintrc.js文…