典型ACL部署所要考虑的事情
实际部署Spring
ACL到业务应用是很复杂的。我们总结了Spring ACL要注意的事情,它们在大多数Spring ACL实现场景中都存在。
关于ACL的伸缩性和性能模型
对于小型和中型应用,添加ACL功能是很容易的,尽管它增加数据库存储和影响运行时性能,这个影响可能不会那么明显。但是,取决于ACL和ACE建模的粒度,在中到大型应用中,数据库的行数可能会非常惊人,甚至对对熟练的DBA都是很难的任务。
让我们假设我们将要扩展ACL以覆盖JBCP Pets应用大多数的功能,包括用户账号和订单,还包括JBCP Pets中顾客论坛的帖子。我们对着数据建模如下:
l 所有的顾客都有账号;
l 10%的顾客拥有订单。其中每个顾客的平均订单数是2;
l 订单对顾客是要保护的(read-only),但是管理员也能访问(read/write);
l 10%的顾客会在顾客论坛上发帖,其中每个顾客的帖子数量是20;
l 帖子对顾客是要进行保护的(read-write),对管理员也是如此。帖子对其它顾客是read-only的。
基于我们对ACL系统的了解,我们知道数据库表有以下的可伸缩相关属性:
表
|
是否随数据伸缩
|
可伸缩性注释
|
ACL_CLASS
|
NO
|
每个域类需要一行
|
ACL_SID
|
Yes(User)
|
每个角色(GrantedAuthority)需要一行
每个用户账号需要一行(如果域对象根据用户保护)
|
ACL_OBJECT_IDENTITY
|
Yes(域类*每个类的实例数)
|
每个保护的域对象需要一行
|
ACL_ENTRY
|
Yes(域对象实例*单个的ACE条目)
|
每个ACE需要一行,对于每个域对象可能要多行
|
我们可以看到ACL_CLASS并没有伸缩性的考虑(大多数的系统少于1000个域类)。ACL_SID是基于系统中的用户数线性伸缩的。这可能不用考虑,因为其它用户相关的表也以这种方式处理伸缩性(如用户账号等)。
要考虑的两个表是ACL_OBJECT_IDENTITY和ACL_ENTRY。如果对一个用户有一个订单这种情况计算需要的行数,我的得到如下的估算结果:
表
|
每个订单的ACL数据
|
每个论坛帖子的ACL数据
|
ACL_OBJECT_IDENTITY
|
每个订单需要一行数据
|
每个帖子需要一行数据
|
ACL_ENTRY
|
三行——一行用于拥有者(即顾客的SID)的read访问,两行(一行用于读访问,一行用于写访问)用于管理员组的SID。
|
四行——一行用于顾客组SID的读访问,一行用于拥有者的写访问,两行用于管理员组(如同订单)
|
我们可以使用以上的假设并计算出ACL的伸缩性矩阵:
表/对象
|
伸缩性因素
|
估算(低)
|
估算(高)
|
用户(Users)
|
|
10,000
|
1,000,000
|
订单(Orders)
|
# Users * 0.1 * 2
|
2,000
|
200,000
|
论坛帖子(ForumPosts)
|
# Users * 0.1 * 20
|
20,000
|
2,000,000
|
ACL_SID
|
# Users
|
10,000
|
1,000,000
|
ACL_OBJECT_IDENTITY
|
# Orders + # Posts
|
22,000
|
2,200,000
|
ACL_ENTRY
|
(# Orders * 3) + (# Posts * 4)
|
86,000
|
8,600,000
|
在典型的ACL实现中,这些预测只是要关联和保护对象的子集,你可以看到存储ACL数据的数据库行数是随着业务数据线性(或更快)增长的。特别是对于大型系统的规划,预测你可能用到的ACL数据特别重要。对于非常复杂的系统拥有数亿行关于ACL存储的数据并不罕见。
不要忽视自定义开发的成本
使用Spring ACL的安全环境通常需要明显的开发工作以及我们讲过的配置步骤。我们例子的配置场景有以下的限制,这可能会影响到将ACL安全应用到完整站点上:
l SID和访问凭证硬编码在应用启动的时候;
l 没有提供管理域对象(创建和删除)或管理用户、组的功能;
l 应用没有有效使用ACL的等级体系。
当整个应用规划Spring ACL时,你必须仔细考虑所有域数据管理的地方,并确保这些地方正确更新ACL和ACE规则并失效缓存。一般来说,方法和数据安全发生在应用的服务或业务层,而维护ACL和ACE所需要的钩子(hook)通常发生在数据访问层。
如果你正在处理一个标准应用的架构,拥有合适的隔离及功能封装,可能会很容易找到一个中央位置标识这些变化。但是,如果你正在处理一个遗留的(或者开始的时候出来没有设计)架构,添加ACL功能并在数据操作的代码中支持钩子(hook)将会很困难。
正如前面所提到的,需要注意的是Spring
ACL自从Acegi 1.x时代就没有明显的变化过,大约三年了。在那时,很多用户尝试使用它,并记录和以文档的形式提出了很多限制,它们中的很多保存在Spring Security JIRA库中(http://jira.springframework.org/)。缺陷SEC-479可以作为很多关键限制的入口,它们中的很多在Spring Security3中依然没有处理,(如果它们适用于你的场景)可能会需要很大的自定义编码工作。
以下是一些最重要和常见的缺陷:
l ACL基础设施需要数字型的主键。对于使用GUID或UUID主键(近来用的越来越多,因为现代数据库提供了高效支持)的应用,这会是很大的限制;
l JIRA缺陷SEC-1140记录的缺陷,默认ACL实现不能用按位操作正确的对比Permission二进制掩码。在关于许可授权一节,我们已经提到;
l 配置Spring ACL的方法与其它Spring
Security功能存在一些不一致。简单来说,在这个功能领域,类代理和属性并没有通过DI(依赖注入)暴露,需要覆盖或重写策略会很耗时且维护代价高昂;
l Permission的二进制掩码通过整数(integer)实现,所以最多有32个可能的位。比较常见的做法是扩展默认的未分配来声明单个对象属性的权限(例如,为读的员工社会保险号分配一个位)。复杂的部署可能会每个域对象超过32个属性,在这种情况下唯一可选的就是为了这个限制,重新对你的域对象建模。
取决于你特定应用的需要,可能会遇到新的问题,尤其是关于这些实现自定义功能要修改的类。
我应该用Spring Security的ACL吗?
正如使用整体使用Spring
Security是很强的业务依赖,使用Spring ACL也是这样——实际上,这对于ACL可能更明显,因为它紧密连接到业务方法和域对象上了。我们希望这个关于Spring ACL的指导已经为你描述了重要的各层配置和Spring ACL的概念,这用来分析Spring ACL在你的应用中如何使用,并帮助你决定和匹配它的功能到实际应用中。
小结
在本章中,我们关注访问控制列表安全以及对于这种类型的安全Spring Security ACL模块是如何实现的。我们所做如下:
l 了解访问控制列表的基本概念,以及为什么说它们是授权的有效解决方式;
l 学习Spring ACL实现的关键概念,包括访问控制条目、SID以及对象标识;
l 考察支持ACL系统的数据库模式以及逻辑设计;
l 配置所有需要的Spring
Bean来启用Spring ACL模块并增强了一个服务接口来使用注解的方法授权。我们接下来将数据库中已有的用户以及站点使用的业务对象,变成ACE声明和辅助的实例数据;
l 了解Spring ACL许可授权处理相关的概念;
l 扩展了我们关于SpringSecurity
JSP标签库和SpEL表达书语言(用于方法安全)的知识来实现ACL检查;
l 讨论易变的ACL概念,并了解在易变的ACL环境中的基本配置和需要自定义的代码;
l 开发了一个自定义的ACL许可授权并配置应用验证器有效性;
l 配置和分析使用Ehcache缓存管理器以减少Spring
ACL的数据库影响;
l 分析在复杂业务应用中使用Spring
ACL的影响以及设计考虑因素。
这完成了本书中关于Spring
Security关键概念的部分。在接下来的章节中,我们将会深入讨论Spring Security认证与多种类型的外部系统进行集成。如果你不知道这些系统(OpenID、LDAP等)背后的技术,我们也将会带领你进行学习,所以请继续阅读。
- 大小: 22 KB
分享到:
相关推荐
spring security acl 代码实例 spring security acl 代码实例spring security acl 代码实例spring security acl 代码实例spring security acl 代码实例spring security acl 代码实例
Spring Security ACL是Spring Security框架的一个重要组成部分,它提供了一种细粒度的访问控制机制,允许开发者对应用程序的数据对象进行权限管理。在Spring Security ACL中,你可以定义哪些用户或角色可以对特定的...
自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 发行版本号 Spring Security 3.0.1 是在 Spring Security 3.0 的基础上...
《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...
- Spring Security 可以与OAuth2框架集成,提供第三方服务的认证和授权,支持资源服务器、认证服务器和客户端的角色。 8. **Spring Security ACL**: - 对象级权限管理(ACL)允许开发者对应用内的具体对象实施细...
- **ACL (spring-security-acl.jar)**:提供了访问控制列表支持。 - **CAS (spring-security-cas-client.jar)**:提供了与 Central Authentication Service (CAS) 的集成支持。 - **OpenID (spring-security-...
在本例中,我们将探讨如何在Spring Security 3.0.4中使用ACL特性。 首先,ACL允许开发者定义对象级别的安全性,这意味着你可以控制用户对特定数据对象的操作权限。例如,你可以设定某个用户只能读取但不能修改特定...
七、Spring Security 的优点 Spring Security 的优点包括: * 高度灵活性:Spring Security 提供了多种身份验证、授权和访问控制机制,满足不同需求。 * 广泛的应用场景:Spring Security 可以应用于多种应用场景...
第一章:一个不安全应用的剖析 第二章:springsecurity...第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用中心认证服务 第十一章:客户端证书认证 第十二章:spring Security扩展
**Spring Security ACL 实现与扩展** **ACL 简介** 访问控制列表(Access Control List,简称 ACL)是一种用于限制不同用户或用户组对资源访问的机制。在计算机安全领域,ACL 允许系统管理员定义特定用户的访问权限...
在Spring Security 3版本中,它引入了许多改进和新特性,以适应不断变化的安全需求和挑战。 一、核心概念 1. **Filter Chain**: Spring Security 的核心在于其过滤器链,它拦截HTTP请求并执行相应的安全处理。过滤...
Spring Security 3是该框架的一个版本,虽然现在已经有更新的版本(如Spring Security 5),但其核心概念和机制仍然适用于现代应用。 **核心组件** 1. **过滤器链**: Spring Security 使用一系列过滤器来拦截HTTP...
7. **OAuth2整合**:Spring Security可以与OAuth2框架集成,支持第三方身份验证服务,如Google、Facebook等,实现社交登录功能。 8. **Web安全**:文档涵盖了HTTP基本认证、表单登录、HTTP方法转换、XSS防护、点击...
7. **集成其他Spring组件**:Spring Security 可以与Spring MVC、Spring Data等其他Spring组件无缝集成。demos中可能包含如何在Spring MVC应用中配置和使用Spring Security的例子。 8. **自定义配置**:Spring ...
- Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...
- OAuth2:SpringSecurity支持OAuth2协议,实现第三方登录和API保护。 - JWT(JSON Web Tokens):可使用JWT进行状态less的认证,提高系统的可扩展性。 - CORS(Cross-Origin Resource Sharing):SpringSecurity...
7. **OAuth2 and JWT支持**:Spring Security 提供了对OAuth2和JSON Web Tokens (JWT) 的支持,这在现代微服务架构中非常重要,因为它允许第三方应用安全地与你的服务进行交互。 8. **表达式语言(SpEL)**:Spring...