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

我不理解保留策略的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/

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

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

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

春季安全

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

>预授权:这允许某些条件/约束
在允许执行方法之前检查.没有
验证这些条件会导致无法调用
方法.
> Postauthorization:这允许某些条件/约束
方法返回后检查.使用频率较低
预授权检查,但可用于提供额外的安全性
特别是围绕复杂的互联业务层方法
围绕与方法返回的对象相关的约束.

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

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

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

有关Spring Security的方法级安全性的更多信息,请参见本documentation第27.3节.

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

Spring Security通过基于表达式的访问控制实现访问控制,但基于属性的访问控制(ABAC)允许对访问进行更细粒度的控制,并由美国国家标准与技术研究院推荐.

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

>用户的身份,角色,职称,地点,部门,日期
出生…
>资源的类型,位置,所有者,价值,部门……
>上下文信息,例如一天中的时间用户的动作
尝试资源

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

>如果员工和记录位于同一区域,员工可以查看记录
>拒绝在下午5点到8点之间访问阅读记录.

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

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

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

> the Abbreviated Language for Authorization (ALFA), which is based on XACML
> the eXtensible Access Control Markup Language (XACML)

ABAC还提供了一个架构,用于定义如何评估和实施策略.

ABAC GRAPH

该体系结构包含以下组件:

>策略执行点(PEP):这是组件
保护您要保护的API /应用程序. PEP拦截
流程,分析它,并向PDP发送授权请求
(见下文).然后它收到一个决定(允许/拒绝)
强制执行.
>策略决策点(PDP)接收授权请求
(例如,Alice可以查看记录#123吗?)并根据该集对其进行评估
已配置的策略.它最终达到了
它发送回PEP的决定.在评估期间
过程,PDP可能需要额外的元数据,例如用户的工作
标题.为此,它可以转向政策信息点(PIP)
>策略信息点(PIP)是PDP之间的接口
和基础数据源,例如LDAP,数据库,REST服务
其中包含有关用户,资源或其他的元数据.您可以使用
用于检索PDP在运行时可能需要的信息的PIP,例如风险
得分,记录的位置或其他.

XACML的实现

完全披露 – 我在XACML技术委员会工作,并在Axiomatics工作,这是一个实施XACML的动态授权提供商.

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

> xacmlDecisionPreAuthz,使用@PreAuthorize调用
> xacmlDecisionPostAuthz,使用@PostAuthorize调用
> xacmlDecisionPreFilter,使用@PostFilter调用
> xacmlDecisionPostFilter,使用@PreFilter调用

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

> xacmlDecisionPreAuthz(Collection< String> attributeCats,
收集和LT;字符串> attributeTypes,Collection< String> attributeIds,
的ArrayList<对象> attributeValues)
> xacmlDecisionPostAuthz(Collection< String> attributeCats,
收集和LT;字符串> attributeTypes,Collection< String> attributeIds,
的ArrayList<对象> attributeValues)
> xacmlDecisionPreFilter(Collection< String> attributeCats,Collection< String>
attributeTypes,Collection< String> attributeIds,ArrayList< Object>
attributeValues)
> 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.

转载注明原文:java – 如何使用注释基于在REST中创建这些资源的用户来授权特定资源 - 代码日志