首页 > 解决方案 > 如何使用注释根据在 REST 中创建资源的用户授权特定资源

问题描述

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

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

} `

我不想将此逻辑与业务逻辑混为一谈。相反,我希望有这样的东西-`

@Authorize
public void getOrder(User user) {
   //business logic
}

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

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

即使我使用反射,我应该将反射逻辑放在哪里?它是否会适得其反我想要实现的目标?

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

标签: javaspringannotationsauthorizationannotation-processing

解决方案


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

春季安全

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

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

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

public interface Sample { ... 
@PostAuthorize("hasRole('ROLE_ADMIN')") 
Event getEvent(); } 

本质上,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 的文档。

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

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 上查看此列表


推荐阅读