如何使用注释基于在REST中创建这些资源的用户来授权特定资源

pri*_*kar 5 java spring authorization annotations annotation-processing

我不理解保留策略的Java注释作为RUNTIME.我要做的是创建一个名为@Authorize的注释,并将其用于需要用户授权的方法,以便执行某些操作(此时用户已经过身份验证).例如.我有一个带有getOrder()方法的订单服务.我只想创建此订单的用户访问它.`

public void getOrder(User user) {
   //current code does something like this
   if(order.getCreatedBy().equals(user)) {
     //then proceed. 
}
Run Code Online (Sandbox Code Playgroud)

}

我不想将这种逻辑与业务逻辑混合在一起.相反,我希望有这样的东西 - `

@Authorize
public void getOrder(User user) {
   //business logic
}
Run Code Online (Sandbox Code Playgroud)

`有几种方法,但并非所有方法都需要这种授权.有人可以解释一下我怎么能把这些碎片装在一起?在这一点上我不明白的是AnnotationProcessor如何在这里帮助我,因为它在编译时发挥了它的魔力.据我所知,它将帮助我在编译时生成一些代码,但我不知道如何使用生成的代码.我在AnnotationProcessors上经历了很多例子,但我仍然遗漏了一些东西.这些链接帮助我了解到目前为止的注释处理 -

http://hannesdorfmann.com/annotation-processing/annotationprocessing101 https://equaleyes.com/blog/2017/09/04/annotation-processing/

即使我使用反射,我应该在哪里放置反射逻辑?它与我想要实现的目标相反吗?

在这一点上,我对其他解决方案也持开放态度,这些解决方案不涉及注释,但会帮助我将业务逻辑与这种特定于资源的授权分离出来.

小智 6

为了在 Java 中实现对方法的授权控制,我强烈推荐使用具有 Spring Security API的可扩展访问控制标记语言 (XACML)实现的 Spring Security。

春季安全

Spring Security 提供了两种主要的方法来保护对方法的访问:

  • 预授权:这允许在允许执行方法之前检查某些条件/约束。未能验证这些条件将导致无法调用该方法。
  • 授权后:这允许在方法返回后检查某些条件/约束。这在预授权检查中使用较少,但可用于为复杂的互连业务层方法提供额外的安全性,尤其是与方法返回的对象相关的约束。

例如,访问控制规则之一是用户在能够调用方法 getEvents() 之前具有 ROLE_ADMIN 权限。在 Spring Security 框架中执行此操作的方法是使用 PreAuthorize 注释,如下所示:

public interface Sample { ... 
@PostAuthorize("hasRole('ROLE_ADMIN')") 
Event getEvent(); } 
Run Code Online (Sandbox Code Playgroud)

本质上,Spring Security 使用运行时面向方面编程 (AOP) 切入点在方法的建议之前执行,并o.s.s.access.AccessDeniedException在不满足指定的安全约束时抛出一个。

可以在本文档的第 27.3 节中找到有关 Spring Security 的方法级别安全性的更多信息

可扩展访问控制标记语言 (XACML) - ABAC 的策略语言

Spring Security 通过其基于表达式的访问控制在实现访问控制方面做得很好,但基于属性的访问控制 (ABAC) 允许对访问进行更细粒度的控制,并且是美国国家标准与技术研究所推荐的。

为了解决基于角色的访问控制 (RBAC) 的局限性,NIST 提出了一种称为 ABAC(基于属性的访问控制)的新模型。在 ABAC 中,您现在可以使用更多元数据/参数。例如,您可以考虑:

  • 用户的身份、角色、职务、位置、部门、出生日期...
  • 资源的类型、位置、所有者、价值、部门...

  • 上下文信息,例如一天中的时间用户尝试对资源进行的操作

所有这些都称为属性。属性是ABAC的基础,因此得名。您可以将这些属性组合到策略中。政策有点像 ABAC 的秘方。策略可以授予和拒绝访问。例如:

  • 如果员工和记录在同一地区,员工可以查看记录
  • 拒绝访问下午 5 点到早上 8 点之间的阅读记录。

策略可用于表达高级场景,例如

  • 职责分离
  • 基于时间的约束(见上文)
  • 基于关系的访问控制(见上文)
  • 委托规则委托 Bob 访问 Alice 的文档。

有两种主要的语法可用于编写策略:

ABAC 还带有一个架构来定义如何评估和执行策略。

ABAC图

该架构包含以下组件:

  • 策略执行点 (PEP):这是保护您要保护的 API/应用程序的组件。PEP 拦截流,对其进行分析,然后向 PDP 发送授权请求(见下文)。然后它收到一个决定(允许/拒绝),它会强制执行。

  • 策略决策点 (PDP) 接收授权请求(例如,Alice 可以查看记录 #123 吗?)并根据已配置的策略集对其进行评估。它最终会做出一个决定,并将其发送回 PEP。在评估过程中,PDP 可能需要额外的元数据,例如用户的职位。为此,它可以求助于政策信息点 (PIP)

  • 策略信息点 (PIP) 是 PDP 和底层数据源(例如 LDAP、数据库、包含有关用户、资源或其他元数据的 REST 服务)之间的接口。您可以使用 PIP 来检索 PDP 在运行时可能需要的信息,例如风险评分、记录位置或其他信息。

XACML 的实现

全面披露 - 我是 XACML 技术委员会的成员,并为Axiomatics工作,这是一个实现 XACML 的动态授权提供商。

Axiomatics 为其Axiomatics Policy Server提供了一个 Spring Security SDK ,它提供了四个表达式,可用于查询 PDP 作为保护方法调用的一部分

  1. xacmlDecisionPreAuthz,用 @PreAuthorize
  2. xacmlDecisionPostAuthz,用 @PostAuthorize
  3. xacmlDecisionPreFilter,用 @PostFilter
  4. xacmlDecisionPostFilter,用 @PreFilter

这些方法的确切签名如下:

  1. xacmlDecisionPreAuthz(Collection<String> attributeCats, Collection<String> attributeTypes, Collection<String> attributeIds, ArrayList<Object> attributeValues)
  2. xacmlDecisionPostAuthz(Collection<String> attributeCats, Collection<String> attributeTypes, Collection<String> attributeIds, ArrayList<Object> attributeValues)
  3. xacmlDecisionPreFilter(Collection<String> attributeCats, Collection<String> attributeTypes, Collection<String> attributeIds, ArrayList<Object> attributeValues)
  4. xacmlDecisionPostFilter (Collection<String> attributeCats, Collection<String> attributeTypes, Collection<String> attributeIds, ArrayList<Object> attributeValues)

有关XACML 实现完整列表,您可以在 Wikipedia 上查看此列表

  • 我花了一些时间来掌握您提到的所有概念并重构现有逻辑。但它是值得的。我终于能够使用 spring 安全性实现自定义解决方案。 (2认同)