SpringSecurity中文文档(Domain Object Security (ACLs))

Domain Object Security (ACLs)

本节描述 SpringSecurity 如何使用访问控制列表(ACL)提供域对象安全性。

复杂的应用程序通常需要定义超出 Web 请求或方法调用级别的访问权限。相反,安全决策需要包括 who (Authentication)、 where (MethodInvation)和 what (Some DomainObject)。换句话说,授权决策还需要考虑方法调用的实际域对象实例主题。

假设您正在为宠物诊所设计一个应用程序。基于 Spring 的应用程序的用户主要有两类: 宠物诊所的工作人员和宠物诊所的客户。员工应该可以访问所有的数据,而客户应该只能看到他们自己的客户记录。为了让它更有趣一点,您的客户可以让其他用户查看他们的客户记录,例如他们的“幼儿园”导师或当地“小马俱乐部”的主席。当您使用 Spring Security 作为基础时,有几种可能的方法:

  • 编写业务方法以加强安全性。您可以查询 Customer 域对象实例中的集合,以确定哪些用户具有访问权限。通过使用 SecurityContextHolder.getContext().GetAuthentication() ,可以访问 Authentication 对象。
  • 编写一个 AccessDecisionVoter 来强制存储在 Authentication 对象中的 GrantedAuthority []实例的安全性。这意味着 AuthenticationManager 需要用自定义 GrantedAuthority []对象填充 Authentication,以表示主体可以访问的每个 Customer 域对象实例。
  • 编写一个 AccessDecisionVoter 来加强安全性,并直接打开目标 Customer 域对象。这意味着您的投票者需要访问一个 DAO,该 DAO 允许它检索 Customer 对象。然后,它可以访问 Customer 对象的已批准用户集合,并做出适当的决策。

这些方法中的每一种都是完全合法的。但是,第一种方法将授权检查与业务代码结合起来。这样做的主要问题包括增加了单元测试的难度,以及在其他地方重用 Customer 授权逻辑更加困难。从 Authentication 对象获取 GrantedAuthority []实例也可以,但不能扩展到大量 Customer 对象。如果一个用户可以访问5,000个 Customer 对象(在这种情况下不太可能,但是想象一下如果它是一个大型 Pony Club 的流行兽医!)消耗的内存量和构造 Authentication 对象所需的时间将是不可取的。最后一种方法,从外部代码直接打开 Customer,可能是这三种方法中最好的一种。它实现了关注点分离,并且不会误用内存或 CPU 周期,但它仍然效率低下,因为 AccessDecisionVoter 和最终的业务方法本身都会调用负责检索 Customer 对象的 DAO。每个方法调用两个访问显然是不可取的。此外,对于列出的每种方法,您都需要从头开始编写自己的访问控制列表(ACL)持久性和业务逻辑。

幸运的是,还有另一种选择,我们稍后将讨论。

Key Concepts

Spring Security 的 ACL 服务在 Spring-Security-ACL-xxx.jar 中提供。您需要将此 JAR 添加到类路径中,以使用 Spring Security 的域对象实例安全性功能。

SpringSecurity 的域对象实例安全性能集中在访问控制列表(ACL)的概念上。系统中的每个域对象实例都有自己的 ACL,ACL 记录谁可以使用该域对象、谁不能使用该域对象的详细信息。考虑到这一点,Spring Security 为您的应用程序提供了三种主要的 ACL 相关功能:

  • 有效检索所有域对象的 ACL 条目(并修改这些 ACL)的方法
  • 一种确保在调用方法之前允许给定主体使用对象的方法
  • 一种确保在调用方法后允许给定主体使用对象(或它们返回的内容)的方法

正如第一个要点所指出的,Spring Security ACL 模块的主要功能之一是提供检索 ACL 的高性能方法。这种 ACL 存储库功能非常重要,因为您系统中的每个域对象实例可能有多个访问控制条目,并且每个 ACL 可能以树形结构从其他 ACL 继承(Spring Security 支持这种功能,它非常常用)。Spring Security 的 ACL 功能经过精心设计,可以提供高性能的 ACL 检索,以及可插入缓存、死锁——最小化数据库更新、独立于 ORM 框架(我们直接使用 JDBC)、适当的封装和透明的数据库更新。

考虑到数据库是 ACL 模块操作的核心,我们需要研究实现中默认使用的四个主要表。在一个典型的 Spring Security ACL 部署中,表按大小顺序显示,最后列出行数最多的表:

  • ACL_SID 允许我们唯一地标识系统中的任何主体或权限(“ SID”代表“安全标识”)。唯一的列是 ID、 SID 的文本表示形式和一个标志,用于指示文本表示形式是引用主体名称还是 GrantedAuthority。因此,每个唯一的主体或 GrantedAuthority 都有一个单独的行。当在接收权限的上下文中使用时,SID 通常称为“接收方”。
  • ACL_CLASS 允许我们唯一地标识系统中的任何域对象类。唯一的列是 ID 和 Java 类名。因此,我们希望为其存储 ACL 权限的每个唯一类都有一行。
  • ACL_OBJECT_IDENTITY 存储系统中每个唯一域对象实例的信息。列包括 ID,ACL _ CLASS 表的一个外键,一个唯一标识符,这样我们就知道了我们提供信息的 ACL_CLASS 实例,父元素,表示域对象实例所有者的 ACL_SID 表的一个外键,以及我们是否允许 ACL 条目从任何父 ACL 继承。对于存储 ACL 权限的每个域对象实例,我们都有一个单独的行。
  • 最后,ACL_ENTRY 存储分配给每个收件人的单独权限。列包括 ACL_OBJECT_IDENTITY 的外键、收件人(即 ACL_SID 的外键) ,不管我们是否要审计,以及表示授予或拒绝的实际权限的整数位掩码。对于每个接收到使用域对象权限的收件人,我们都有一个单独的行。

正如上一段提到的,ACL 系统使用整数位屏蔽。但是,要使用 ACL 系统,您不必知道位移的细节。只要说我们有32位可以开关就足够了。每个位表示一个权限。默认情况下,权限是读(位0)、写(位1)、创建(位2)、删除(位3)和管理(位4)。如果希望使用其他权限,可以实现自己的 Permission 实例,而 ACL 框架的其余部分在不知道扩展的情况下运行。

您应该理解,您系统中域对象的数量与我们选择使用整数位掩码这一事实完全没有关系。虽然您有32位可用于权限,但可能有数十亿个域对象实例(这意味着 ACL _ OBJECT _ IDENTITY 中有数十亿行,可能还有 ACL _ ENTRY)。我们之所以提出这个观点,是因为我们发现,人们有时会错误地认为,他们需要为每个潜在的域对象添加一点,但事实并非如此。

现在,我们已经提供了 ACL 系统的基本概述,以及它在表结构级别的外观,我们需要探索关键的接口:

  • Acl: 每个域对象都有且只有一个 Acl 对象,该对象在内部保存 AccessControlEntry 对象,并且知道 Acl 的所有者。Acl 不直接引用域对象,而是引用 ObjectIdentity。ACL 存储在 ACL _ OBJECT _ IDENTITY 表中。
  • AccessControlEntry: Acl 包含多个 AccessControlEntry 对象,这些对象在框架中通常缩写为 ACE。每个 ACE 都引用 Permission、 Sid 和 Acl 的特定元组。ACE 还可以授予或不授予权限,并包含审计设置。ACE 存储在 ACL _ ENTRY 表中。
  • ObjectIdentity: 每个域对象在 ACL 模块内部由 ObjectIdentity 表示。
  • AclService: 检索适用于给定 ObjectIdentity 的 Acl。在所包含的实现(JdbcAclService)中,检索操作委托给 LookupStrategy。LookupStrategy 为检索 ACL 信息提供了高度优化的策略,使用批量检索(BasicLookupStrategy) ,并支持使用物化视图、分层查询和类似的以性能为中心的非 ANSI SQL 功能的自定义实现。
  • MutableAclService: 允许为持久性显示修改后的 Acl。此接口的使用是可选的。

请注意,我们的 AclService 和相关数据库类都使用 ANSI SQL。因此,这应该适用于所有主要的数据库。在写这篇文章的时候,系统已经成功地用 Hypersonic SQL,postgreSQL,Microsoft SQL Server 和 Oracle 进行了测试。

SpringSecurity 附带了两个示例,演示了 ACL 模块。第一个示例是联系人示例,另一个示例是文档管理系统(DMS)示例。我们建议看看这些例子。

Getting Started

要开始使用 Spring Security 的 ACL 功能,您需要将 ACL 信息存储在某个地方。这就需要在 Spring 中实例化 DataSource。然后将 DataSource 注入到 JdbcMutableAclService 和 BasicLookupStrategy 实例中。前者提供了 mutator 功能,后者提供了高性能的 ACL 检索功能。有关示例配置,请参阅 SpringSecurity 附带的一个示例。还需要使用前一节中列出的四个 ACL 特定表填充数据库(有关适当的 SQL 语句,请参阅 ACL 示例)。

创建了所需的模式并实例化了 JdbcMutableAclService 之后,需要确保域模型支持与 Spring Security ACL 包的互操作性。希望 ObjectIdentityImpl 证明是足够的,因为它提供了大量使用它的方法。大多数人都有包含公共 SerializablegetId ()方法的域对象。如果返回类型为 long 或与 long (如 int)兼容,则可能会发现无需进一步考虑 ObjectIdentity 问题。ACL 模块的许多部分依赖于长标识符。如果不使用 long (或 int、 byte 等) ,则可能需要重新实现许多类。我们不打算在 Spring Security 的 ACL 模块中支持非长标识符,因为 long 已经与所有数据库序列兼容,是最常见的标识符数据类型,并且具有足够的长度来适应所有常见的使用场景。

下面的代码片段显示了如何创建 Acl 或修改现有的 Acl:

// Prepare the information we'd like in our access control entry (ACE)
ObjectIdentity oi = new ObjectIdentityImpl(Foo.class, new Long(44));
Sid sid = new PrincipalSid("Samantha");
Permission p = BasePermission.ADMINISTRATION;// Create or update the relevant ACL
MutableAcl acl = null;
try {
acl = (MutableAcl) aclService.readAclById(oi);
} catch (NotFoundException nfe) {
acl = aclService.createAcl(oi);
}// Now grant some permissions via an access control entry (ACE)
acl.insertAce(acl.getEntries().length, p, sid, true);
aclService.updateAcl(acl);

在上面的示例中,我们检索与标识符号为44的 Foo 域对象关联的 ACL。然后,我们添加一个 ACE,以便名为“ Samantha”的主体可以“管理”对象。代码片段相对来说是自解释的,除了 insert tAce 方法之外。Insert tAce 方法的第一个参数确定插入新条目的 Acl 中的位置。在上面的示例中,我们将新 ACE 放在现有 ACE 的末尾。最后一个参数是一个布尔值,指示 ACE 是授予还是拒绝。大多数情况下,它授予(真实)。但是,如果拒绝(假) ,则实际上阻止了权限。

Spring Security 没有提供任何特殊的集成来自动创建、更新或删除 ACL,将其作为 DAO 或存储库操作的一部分。相反,您需要为各个域对象编写类似于前面示例中所示的代码。您应该考虑在服务层上使用 AOP 来自动地将 ACL 信息与服务层操作集成在一起。我们发现这种方法是有效的。

一旦您使用这里描述的技术在数据库中存储了一些 ACL 信息,下一步就是实际使用 ACL 信息作为授权决策逻辑的一部分。你有很多选择。您可以编写自己的 AccessDecisionVoter 或 AfterInvocationProvider (分别)在方法调用之前或之后触发。这样的类将使用 AclService 检索相关的 ACL,然后调用 ACL.isGranted (Permission [] mission,Sid [] sids,boolean Administration ativeMode)来决定是否授予或拒绝授权。或者,您可以使用我们的 AclEntryVoter、 AclEntryAfterInvocationProvider 或 AclEntryAfterInvocationCollectionFilteringProvider 类。所有这些类都提供了一种基于声明的方法来在运行时计算 ACL 信息,从而使您无需编写任何代码。

请参阅示例应用程序以了解如何使用这些类。

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

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

相关文章

form原生表单以及el-from表单阻止表单默认提交事件,上传文件自动提交刷新以及input输入框按下enter键自动搜索的事件

问题: 1.form原生表单以及el-from表单阻止表单默认提交事件 2.上传文件自动提交刷新 3.只有一个input输入框按下enter键自动搜索提交的事件 解决方案: 1.el-form使用submit.native.prevent 2.form表单使用οnsubmit"return false"

如何切换手机的ip地址

在数字时代的浪潮中,智能手机已成为我们日常生活中不可或缺的一部分。然而,随着网络安全问题的日益凸显,保护个人隐私和数据安全变得尤为重要。其中,IP地址作为网络身份的重要标识,其安全性与隐私性备受关注。本文将详…

智谱AI开源代码生成大模型 CodeGeeX4-ALL-9B

智谱AI 旗下的代码生成大模型 CodeGeeX 正式发布第四代开源版本:CodeGeeX4-ALL-9B,其是集代码补全和生成、代码问答、代码解释器、工具调用、联网搜索、项目级代码问答等能力于一体的代码大模型,是目前百亿(10B)参数以…

打开 Windows 磁盘管理程序的不同方法总结

如何打开磁盘管理 Windows 怎么打开磁盘管理呢?下面总结了几种不同的方法用来打开磁盘管理。 快速访问菜单 我们可以使用快捷键“WinX”或者将鼠标移动到开始菜单位置右键,这样就可以打开快速访问菜单,然后选择磁盘管理即可打开程序。 运行…

浅谈VPS主机上的数据库性能优化

如何提高网站性能?一个显而易见的解决方案是升级托管账户。您的网站将拥有更多硬件资源,因此可以同时处理更多请求并更快地传递数据。 无论如何,人们都是这么认为的。但事实总是不一样。 现代网站是一个复杂的系统,包含许多必须…

c++ primer plus 第15章友,异常和其他:异常,15.3.3 异常机制

#c primer plus 第15章友,异常和其他:异常,15.3.3 异常机制 异常,15.3.3 异常机制 文章目录 15.3.3 异常机制15.3.3 异常机制程序清单 15.9error3.cpp15.3.4 将对象用作异常类型程序清单15.10exc mean.h程序清单 15.11error4.cpp 15.3.3 异常机制 15.3.…

【STM32标准库】DMA双缓冲模式

1.双缓冲模式简介 设置DMA_SxCR寄存器的DBM位为1可启动双缓冲传输模式,并自动激活循环模式,所以设置普通模式或者循环模式都可以。 双缓冲不应用与存储器到存储器的传输。可以应用在从存储器到外设或者外设到存储器。 双缓冲模式下, 两个存…

IC认证介绍

IC认证是什么? IC是加拿大工业部Industry Canada的简称,作为政府机构,负责电子电器产品进入加拿大市场的认证事务。与美国的FCC相似,IC目前只在电磁干扰上做限制。一般规定:仅限制EMI,认证方式也与FCC相同…

vue3 身份证校验、识别性别/生日/年龄

表单项绑定 change 事件 <template><el-form ref"employeeFormRef" :model"form" :rules"rules" label-width"120px"><el-form-item label"身份证号" prop"idCardNo"><el-input v-model&qu…

领略超越王勃的AI颂扬艺术:一睹其惊艳夸赞风采

今日&#xff0c;咱也用国产AI技术&#xff0c;文心一言3.5的文字生成与可灵的图像创作&#xff0c;自动生成一篇文章&#xff0c;提示语文章末下载。 【玄武剑颂星际墨侠】 苍穹为布&#xff0c;星辰织锦&#xff0c;世间万象&#xff0c;皆入我玄武剑公众号之浩瀚画卷。此号…

Python入门 函数传递

目录 函数的多返回值 函数的多种传参形式 位置参数 关键字参数 缺省参数 不定长参数 位置传递 关键字传递 函数作为参数传递 lambda匿名函数 函数定义中 匿名函数的语法 函数的多返回值 按照返回值的顺序&#xff0c;与对应顺序的多个变量接受即可 变量之间用逗号…

SPI协议——对外部SPI操作(跨页读写)

关于W25Q32JVSSIQ的详细内容在之前的两篇文章中已经详细介绍&#xff0c;本文不做太多赘述&#xff0c;如果对芯片的了解有缺失的话&#xff0c;可以参考&#xff1a; SPI协议——对外部SPI Flash操作-CSDN博客 SPI协议——读取外部SPI Flash ID_spi flash 读取id-CSDN博客 目录…

【SpringCloud应用框架】Nacos集群配置

第八章 Spring Cloud Alibaba Nacos之集群配置 文章目录 一、Linux版NacosMySql生产环境配置具体配置&#xff1a; 二、Nacos集群配置更改Nacos启动命令配置原理具体配置测试启动总结 一、Linux版NacosMySql生产环境配置 上一篇博客中已经了解了Nacos生产环境下需要搭建集群配…

ubuntu20.04:ROS驱动usb相机和livox雷达——Noetic版本

简单记录驱动相机和雷达并录包。 目录 前言 一、ROS的简单安装 二、安装USB相机驱动 1.准备工作 2.安装usb_cam驱动 3.修改配置文件和启动相机节点 另一种安装方式 三、配置Livox雷达 1.安装Livox SDK2 2.安装livox_ros_driver2 3.配置和启动雷达节点 四、录制bag包…

XDMA原理学习(1)——DMA技术详解

目录 一、什么是DMA&#xff1f;为什么需要DMA&#xff1f; 二、DMA分类 2.1 Block DMA 2.2 Scatter-Gather DMA 2.3 Ring buffer DMA 三、实际案例 3.1 STM32微处理器 3.1.1 Block DMA 3.1.2 Scatter-Gather DMA 3.1.3 使用场景举例&#xff1a; 3.1.4 配置与实现 …

Q_OBJECT 的作用

在Qt框架中&#xff0c;Q_OBJECT宏起着至关重要的作用。当你在一个类中使用Q_OBJECT宏时&#xff0c;它提供了以下功能&#xff1a; 元对象系统支持&#xff1a;Q_OBJECT宏启用了Qt的元对象系统&#xff0c;允许对象进行内省&#xff08;introspection&#xff09;。这意味着对…

MySQL8之mysql-community-client-plugins的作用

mysql-community-client-plugins是MySQL社区版客户端的一组插件&#xff0c;它们扩展了MySQL客户端的功能。这些插件通常用于增强客户端的某些特定能力&#xff0c;如连接管理、数据处理、安全验证等。以下是对mysql-community-client-plugins的详细解释&#xff1a; 一、功能…

3GPP R18 Multi-USIM 是怎么回事?(三)

这篇内容相对来说都是一些死规定,比较枯燥。主要是与MUSIM feature相关的mobility and periodic registration和service request触发过程的一些规定,两部分的内容是有部分重叠的,为保证完整性,重复部分也从24.501中摘了出来。 24.501 4.25 网络和MUSIM UE可以支持MUSIM fe…

idea控制台乱码问题解决教程

注&#xff1a;按顺序来操作&#xff0c;完成后要重启软件 方案一&#xff1a;修改Tomcat的编码设置 在Tomcat的VM options中添加了-Dfile.encodingUTF-8 方案二&#xff1a;修改IDEA的编码设置 File->Settings->Editor->File Encodings 将Global Encoding、Proj…

应用服务启动提示数据库连接太多,被锁住 同一ip无法再次连接问题

今天在启动应用的时候 提示数据库连接过多&#xff0c;对应的ip无法再次连接到数据库导致应用无法启动的问题 临时解决方案&#xff1a; 1、查看目前最大连接数是多少 show variables like ‘%max_connect_errors%’; 2、修改最大连接数为1000 set global max_connect_errors…