1.概述
今天,我们将回顾基于表达式的访问控制(EBAC),基于角色的访问控制(RBAC)和基于属性的访问控制(ABAC)之间的区别,并将重点放在EBAC上。
2.什么是基于表达式的访问控制?
简而言之,基于表达式的访问控制是使用表达式来编写授权。
短语基于表达式的访问控制 (EBAC)当前最常与使用Spring Expression Language表达式来编写授权相关联。
在Spring Security 3.0中,引入了使用Spring EL表达式作为授权机制的能力,除了简单使用配置属性和访问决策投票者之外。
但是,使用表达式的访问控制并不仅仅局限于Spring安全! 这篇博客文章部分是要求更大的社区认可将授权中的表达式用作基于表达式的访问控制(EBAC),因为它与其他形式的访问控制有独特的不同,因为它可以让您实现其他功能访问控制的形式,例如RBAC和ABAC。
EBAC的其他示例包括MapR中的访问控制表达式(ACE)和Windows中的动态访问控制 。 也可能还有其他,例如PHP Framework Symfony 。
基于表达式的访问控制(EBAC)是否等同于基于属性的访问控制(ABAC)?
不可以,但是ABAC可以与EBAC一起实施。
根据NIST特别出版物800-162,这是ABAC的高级定义:
一种访问控制方法,其中,根据主题的分配属性,对象的分配属性,环境条件以及根据这些属性和条件指定的一组策略,授予或拒绝对象对对象执行操作的请求
考虑到这一点,我们可以使用一种表达式语言(例如基于Spring Expression Language的表达式)编写自己的表达式,然后可以使用现有的@PreAuthorize , @PostAuthorize , @PreFilter和@PostFiler , sec:authorize标签甚至从拦截中进行调用-url条件。
基于表达式的访问控制(EBAC)是否等效于基于角色的访问控制(RBAC)?
不,EBAC不等同于RBAC,但是RBAC内置于某些表达语言中,例如Spring EL。 例如,以下两个常用表达式使我们能够轻松实现RBAC:
- hasRole([角色])
- hasAnyRole([role1,role2])
但是,在编写细粒度的授权规则时,我们很容易开始编写超出RBAC粒度级别的表达式。
3. Web安全表达式
EBAC实现(例如Spring Security)使我们能够保护URL。 表达式应评估为true或false,定义是否授予访问权限。 在Java配置中基于userID限制RESTful应用程序中访问的示例:
http
.authorizeRequests()
.antMatchers("/user/{userId}/**").access("@webSecurity.checkUserId(authentication,#userId)")
...
4.方法安全性表达式
方法的安全性比允许或拒绝要复杂得多。
例如,在Spring Security中,有四个注释具有表达式属性,以执行调用前和调用后的授权检查,还支持过滤提交的集合参数或返回值。
最常用的@PreAuthorize决定是否可以实际调用方法。
@PostAuthorize (一种不常用的注释)在调用方法后执行访问控制检查。
使用@PostFilter ,Spring Security遍历返回的集合并删除提供的表达式为false的所有项目。
@PreFilter允许我们在方法调用之前进行过滤,但这并不常用。
下面是一个将PreAuthorize与@PostFilter结合使用以实现更细粒度安全性的示例:
@PreAuthorize("hasRole('USER')")
@PostFilter("hasPermission(filterObject, 'read') or hasPermission(filterObject, 'admin')")
public List<contact> getAll();
5.何时使用基于表达式的访问控制(EBAC)?
如果我们需要的安全性比简单的访问控制列表(ACL)需要更多的粒度,则我们需要使用EBAC。 我们如何决定实施EBAC取决于我们拥有什么资源。 例如,在使用Spring Security的组织中,为什么不使用其Spring EL? 同样,如果我们拥有MapR,那么我们将使用其访问控制表达式。
在其他情况下,为了满足组织的需求,可能需要以偏爱的语言编写我们自己的表达语言,以实施EBAC。 我们之所以花时间来这样做,当然是为了使我们能够在所需条件下实现所需的访问控制。 一旦我们拥有足够的表达语言来完成此任务,另一个好处就是,我们不太可能依赖他人-无论是现成的商品还是开源的。
六,结论
各种软件都具有使用表达式编写授权的能力,例如MapR,Windows,当然还有Spring Security。 如果可以使用表达式来实现细粒度的访问控制,那么我将其称为-基于表达式的访问控制(EBAC),并建议您将其引用。 通过给它起一个名字,我们更有可能使用它来保护我们的系统,而不是传统的RBAC。 这样做很好,因为细粒度的访问控制(如果正确完成)更有可能防止违反行为。
翻译自: https://www.javacodegeeks.com/2019/01/expression-based-access-control.html