Shiro-03-shiro 核心概念 Subject,SecurityManager 和 Realms

核心概念:Subject,SecurityManager 和 Realms

Shiro的体系结构具有三个主要概念-主题(Subject),安全管理器(SecurityManager)和领域(Realms)。

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

Subject

在保护应用程序安全时,可能要问自己最相关的问题是:“当前用户是谁?”或“是否允许当前用户执行X”?

在编写代码或设计用户界面时,我们通常会问自己以下问题:应用程序通常是基于用户案例构建的,并且您希望基于每个用户来表示(和保护)功能。

因此,我们考虑应用程序安全性的最自然方法是基于当前用户。

Shiro的API从根本上代表了这种思维方式。

“主题”一词是一个安全术语,基本上表示“当前正在执行的用户”。它只是不被称为“用户”,因为“用户”一词通常与人类相关联。

在安全领域中,“主题”一词可以表示一个人,但也可以指第三方进程,守护程序帐户或任何类似内容。它仅表示“当前正在与软件交互的事物”。

不过,对于大多数意图和目的,您都可以将其视为Shiro的“用户”概念。

您可以在代码中的任何位置轻松获取Shiro主题,如下面的清单1所示。

  • List1
import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;
...
Subject currentUser = SecurityUtils.getSubject();

获取主题后,您可以立即访问当前用户想要使用Shiro进行的所有操作的90%,例如登录,注销,访问其会话,执行授权检查等等-但稍后会介绍更多 。

这里的关键是Shiro的API在很大程度上是直观的,因为它反映了开发人员在“每用户”安全控制中进行思考的自然趋势。

在代码中的任何地方访问主题也很容易,从而可以在需要的地方进行安全操作。

安全管理器

主题的“幕后”对应对象是SecurityManager。

主题代表当前用户的安全操作,而SecurityManager管理所有用户的安全操作。它是Shiro体系结构的核心,是一种“伞”对象,它引用了许多内部嵌套的安全组件,这些安全组件构成了一个对象图。但是,一旦配置了SecurityManager及其内部对象图,通常就不理会它,应用程序开发人员几乎将所有时间都花在Subject API上。

那么如何设置SecurityManager?

好吧,这取决于您的应用程序环境。

例如,Web应用程序通常将在web.xml中指定Shiro Servlet过滤器,这将设置SecurityManager实例。如果您运行的是独立应用程序,则需要以其他方式进行配置。但是有许多配置选项。

每个应用程序几乎总是只有一个SecurityManager实例。

它本质上是一个应用程序单例(尽管不必是静态单例)。像Shiro中的几乎所有内容一样,默认的SecurityManager实现是POJO,并且可以使用任何与POJO兼容的配置机制-常规Java代码,Spring XML,YAML,.properties和.ini文件等进行配置。基本上,任何能够实例化类的东西并且可以使用与JavaBeans兼容的调用方法。

为此,Shiro通过基于文本的INI配置提供了默认的“共母”解决方案。

INI易于阅读,易于使用,并且几乎不需要依赖项。您还将看到,通过简单地了解对象图导航,可以有效地使用INI来配置简单的对象图,例如SecurityManager。

请注意,Shiro还支持Spring XML配置和其他替代方案,但我们将在此处介绍INI。

下面的清单2中的示例显示了基于INI配置Shiro的最简单示例。

  • List2 使用 INI 配置
[main]
cm = org.apache.shiro.authc.credential.HashedCredentialsMatcher
cm.hashAlgorithm = SHA-512
cm.hashIterations = 1024
# Base64 encoding (less text):
cm.storedCredentialsHexEncoded = false
iniRealm.credentialsMatcher = $cm[users]
jdoe = TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJpcyByZWFzb2
asmith = IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbXNoZWQsIG5vdCB

在清单2中,我们看到了用于配置SecurityManager实例的INI配置示例。

INI分为两个部分:[main]和[users]。

[main]部分是配置SecurityManager对象和/或SecurityManager使用的任何对象(如领域)的地方。在此示例中,我们看到两个对象被配置:

cm对象,它是Shiro的HashedCredentialsMatcher类的实例。如您所见,cm实例的各种属性是通过“嵌套点”语法配置的,该语法由清单3所示的IniSecurityManagerFactory用来表示对象图导航和属性设置。

iniRealm对象,是SecurityManager用来表示以INI格式定义的用户帐户的组件。

在[用户]部分中,您可以指定用户帐户的静态列表-适用于简单的应用程序或测试时。

出于本简介的目的,理解每一部分的复杂性并不重要,而是要了解INI配置是配置Shiro的一种简单方法。

有关INI配置的更多详细信息,请参阅Shiro的文档。

  • List3 加载配置文件
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.util.Factory;//1. Load the INI configuration
Factory<SecurityManager> factory =
new IniSecurityManagerFactory("classpath:shiro.ini");//2. Create the SecurityManager
SecurityManager securityManager = factory.getInstance();//3. Make it accessible
SecurityUtils.setSecurityManager(securityManager);

在清单3中,在这个简单的示例中,我们看到了一个三步过程:

  1. 加载将配置SecurityManager及其组成组件的INI配置。

  2. 根据配置(使用代表工厂方法设计模式的Shiro的工厂概念)创建SecurityManager实例。

  3. 使SecurityManager单例可被应用程序访问。

在这个简单的示例中,我们将其设置为VM静态单例,但这通常不是必需的-您的应用程序配置机制可以确定是否需要使用静态内存。

Realms(领域)

Shiro中的第三个也是最后一个核心概念是领域。

领域充当Shiro与应用程序的安全数据之间的“桥梁”或“连接器”。

也就是说,当需要真正与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从为一个应用程序配置的一个或多个Realms中查找其中的许多内容。

从这个意义上说,领域本质上是特定于安全性的DAO:它封装了数据源的连接详细信息,并根据需要使关联数据可用于Shiro。在配置Shiro时,您必须至少指定一个领域用于身份验证和/或授权。可以配置多个Realm,但至少需要一个。

Shiro提供了开箱即用的领域,可以连接到许多安全数据源(又名目录),例如LDAP,关系数据库(JDBC),文本配置源(例如INI和属性文件)等等。

如果默认的Realms不能满足您的需求,那么您可以插入自己的Realm实现以表示自定义数据源。

下面的清单4是配置Shiro(通过INI)以将LDAP目录用作应用程序的领域之一的示例。

  • 清单4.示例领域配置
[main]
ldapRealm = org.apache.shiro.realm.ldap.JndiLdapRealm
ldapRealm.userDnTemplate = uid={0},ou=users,dc=mycompany,dc=com
ldapRealm.contextFactory.url = ldap://ldapHost:389
ldapRealm.contextFactory.authenticationMechanism = DIGEST-MD5 

现在,我们已经了解了如何设置基本的Shiro环境,让我们讨论您作为开发人员如何使用该框架。

在这里插入图片描述

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

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

相关文章

阿里云香港轻量应用服务器怎么样,建站速度快吗?

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

[java基础揉碎]类与对象

目录 类与对象的引出: 类与对象的概述: 类与对象在内存中的布局: 属性的注意细节: 类与对象在内存中创建的过程: 类与对象的引出: 例如这样一个问题: 如果用单独变量来解决, 就会有一个问题, 不利于数据的管理, 将所有猫的信息都给拆解了: 如果用数组来解决, 则会有 1)数…

ClickHouse--11--ClickHouse API操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.Java 读写 ClickHouse API1.1 首先需要加入 maven 依赖1.2 Java 读取 ClickHouse 集群表数据JDBC--01--简介 ClickHouse java代码 1.3 Java 向 ClickHouse 表中写…

计算机设计大赛 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

Mysql5.6忘记密码,如何找回(windows)

mysql5.6安装 第一步&#xff1a;关闭正在运行的数据库服务 net stop mysql第二步&#xff1a;在my.ini文件当中的[mysqld] 任意一个位置放入 skip-grant-tables第三步&#xff1a;启动mysql服务 net start mysql第四步&#xff1a;服务启动成功后就可以登录了&#xff0c;…

举个栗子!Tableau 技巧(265):灵活对比文本表的行数据

通过文本表查看数据时&#xff0c;我们经常需要将某一行数据与其他行进行对比&#xff0c;如何能更灵活更直观的对比分析各行数据情况呢&#xff1f; 可以试试这个方法&#xff01;如下示例&#xff1a;点击某明细行时&#xff0c;该明细行会自动置顶&#xff0c;且其它行会新…

Linux系统:iptables 防火墙

目录 一、安全技术与防火墙 1、安全技术概念 2、防火墙 2.1 防火墙概念 2.2 防火墙分类 2.3 linux的防火墙Netfilter 2.4 防火墙工具介绍 2.5 netfilter 和 iptables 的关系 二、iptables 1、概念 2、五表五链 2.1 五个table表 2.2 五个chain链 2.3 内核中数据包…

ClickHouse--06--其他扩展MergeTree系列表引擎

其他扩展MergeTree系列 MergeTree 系列表引擎 --种类 MergeTree 系 列 表 引 擎 包 含 &#xff1a; MergeTreeReplacingMergeTreeSummingMergeTree&#xff08;汇总求和功能&#xff09;AggregatingMergeTree&#xff08;聚合功能&#xff09;CollapsingMergeTree&#xff08…

- 项目落地 - 《选择项目工具的方法论》

本文属于专栏《构建工业级QPS百万级服务》 提纲&#xff1a; 选择大概率能完成业务目标的工具选择最适合的工具制作最适合的工具 本文所说的项目工具&#xff0c;泛指业务软件开发&#xff0c;所依赖的第三方提供的成熟的资源。包括但不限于开发语言、编辑工具、编译工具、三方…

IgG1 (mouse), ELISA kit——ENZO热销产品

90分钟内可得结果的高特异性定量ELISA试剂盒 免疫球蛋白G&#xff08;IgG&#xff09;是一种免疫球蛋白单体&#xff0c;由两条&#xff08;γ&#xff09;重链和两条轻链组成。每个IgG分子包含两个抗原结合域和一个效应&#xff08;Fc&#xff09;域。Enzo Life Sciences可提供…

WebService接口测试

WebService的理解 WebService就是Web服务的意思&#xff0c;对应的应用层协议为SOAP&#xff08;相当于HTTP协议&#xff09;&#xff0c;可理解为远程调用技术。 特点&#xff1a; 客户端发送的请求主体内容&#xff08;请求报文&#xff09;的格式为XML格式 接口返回的响…

学习数据结构和算法的第9天

题目讲解 移除元素 ​ 给你一个数组nums和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val的元素&#xff0c;并返回移除后数组的新长度。 ​ 不要使用额外的数组空间&#xff0c;你必须仅使用0(1)额外空间并 原地 修改输入数组。 ​ 元素的顺序可以改变。你不需要…

电脑屏幕录制工具 Top10 榜单,免费无水印方法集

随着媒体行业的突飞猛进&#xff0c;不同服务之间对有效屏幕录制的竞争日益激烈。这导致市场上出现了质量参差不齐的屏幕录像机。特别是有些录屏器会自动给你录制的视频加上水印&#xff0c;给需要在公共场合使用的人留下不专业的印象。除此之外&#xff0c;它们甚至不能保护您…

OS文件管理

文件管理 文件的属性 文件所包含的属性&#xff1a; 文件名&#xff1a;由创建文件的用户决定文件名&#xff0c;主要为了方便用户找到文件&#xff0c;同一目录下不允许有重名文件。标识符&#xff1a;一个系统内的各文件标识符唯一&#xff0c;对用户来说毫无可读性&#…

vm centos7 docker 安装 mysql 5.7.28(2024-02-18)

centos系统版本 [rootlocalhost mysql5.7]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) docker版本 拉取指定版本镜像 docker pull mysql:5.7.28 docker images 创建挂载目录&#xff08;数据存储在centos的磁盘上&#xff09; mkdir -p /app/softwa…

全面的ASP.NET Core Blazor简介和快速入门

前言 因为咱们的MongoDB入门到实战教程Web端准备使用Blazor来作为前端展示UI&#xff0c;本篇文章主要是介绍Blazor是一个怎样的Web UI框架&#xff0c;其优势和特点在哪&#xff1f;并带你快速入门上手ASP.NET Core Blazor(当然这个前提是你要有一定的C#编程基础的情况&#x…

大数据01-导论

零、文章目录 大数据01-导论 1、数据与数据分析 **数据&#xff1a;是事实或观察的结果&#xff0c;是对客观事物的逻辑归纳&#xff0c;是用于表示客观事物的未经加工的原始素材。**数据可以是连续的值&#xff0c;比如声音、图像&#xff0c;称为模拟数据&#xff1b;也可…

探索【注解】、【反射】、【动态代理】,深入掌握高级 Java 开发技术

文章目录 Java注解1.注解基础2.注解原理 反射1.Class对象的获取1.基础公共类1.1.Object > getClass()1.2.类名.class 的方式1.3.Class.forName() 2.获取类的成员变量3.获取成员方法并调用4.反射优缺点 代理1.结构2.静态代理2.1.案例1-计算前后校验2.1.1.创建接口2.1.2.创建实…

Ubuntu20.04 安装jekyll

首先使根据官方文档安装&#xff1a;Jekyll on Ubuntu | Jekyll • Simple, blog-aware, static sites 如果没有报错&#xff0c;就不用再继续看下去了。 我这边在执行gem install jekyll bundler时报错&#xff0c;所以安装了rvm&#xff0c;安装rvm可以参考这篇文章Ubuntu …

javaweb——socket

定义 Socket&#xff08;套接字&#xff09;是计算机网络编程中的一种抽象&#xff0c;用于在网络上进行通信。它允许计算机之间通过网络进行数据传输。在Java中&#xff0c;Socket类提供了对TCP/IP协议的支持&#xff0c;通过它可以创建客户端和服务端程序&#xff0c;实现网…