【问题标题】:How to authorize specific resources based on users who created those in REST, using annotations如何使用注释根据在 REST 中创建资源的用户授权特定资源
【发布时间】:2018-12-09 12:22:40
【问题描述】:

我不太理解具有保留策略的 Java 注释作为 RUNTIME。我要做的是创建一个名为 @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/

即使我使用反射,我应该将反射逻辑放在哪里?它会适得其反吗?

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

【问题讨论】:

  • 大家可以看看spring security:spring.io/projects/spring-security
  • 我认为它更多的是基于角色的安全性。我正在寻找更细粒度的选择
  • 基于活动或许可。正确的 ? .您仍然可以使用 spring security 来执行此操作。寻找 hasAuthority
  • 我们使用 @PreAuthorize 保护数据,它允许通过以下方式进行访问控制:- hasRole,- hasAuthority - 轻松将权限映射到角色, - &&,||,() - 支持运算符, - 使用的原则(例如登录), - 自定义 bean - 具有返回布尔值的方法的类,检查经过身份验证的用户的资源可访问性。最常见的情况是用户具有特定权限 + 属于与资源相关的用户组(例如同一家公司)。 docs.spring.io/spring-security/site/docs/5.0.6.RELEASE/…

标签: java spring annotations authorization annotation-processing


【解决方案1】:

要在 Java 中实现对方法的授权控制,我强烈推荐 Spring Security with an eXtensible Access Control Markup Language (XACML) 实现,它具有 Spring Security API。

春季安全

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

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

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

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

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

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

  • 上下文信息,例如用户的操作时间 在资源上尝试

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

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

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

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

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

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)

对于entire list of XACML implementations, you can check this list on Wikipedia

【讨论】:

  • 我花了一段时间才掌握了您提到的所有概念并重构了现有逻辑。但它是值得的。我终于能够使用 Spring Security 实现自定义解决方案。
  • 太棒了。很高兴听到它!如果你在 Github 上有它或者能够分享它,我很乐意看到它。
  • 嗨,我有类似的要求,我找不到显示此流程的演示代码。有的话可以分享一下示例代码吗?
  • 嗨@SridharC,我的经验主要是商业现成产品Axiomatics Policy Server。 WSO2 和 AuthZForce 等开源解决方案是开源的。我建议了解一下这些解决方案之间的比较。
  • @MichaelCGood:以/api/users为例,当app的管理员请求url时,应该返回所有用户。而当 Alice 请求 url 时,应该只返回具有相同区域的用户。因此,对于策略user.region == record.region,由于根本没有record,因此无法在查询之前对其进行评估,如果在查询之后评估,则将排除没有相同区域的用户,但这会导致其他问题,例如分页.
猜你喜欢
  • 2018-10-11
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
相关资源
最近更新 更多