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 的方法级别安全性的更多信息。
Spring Security 通过其基于表达式的访问控制在实现访问控制方面做得很好,但基于属性的访问控制 (ABAC) 允许对访问进行更细粒度的控制,并且是美国国家标准与技术研究所推荐的。
为了解决基于角色的访问控制 (RBAC) 的局限性,NIST 提出了一种称为 ABAC(基于属性的访问控制)的新模型。在 ABAC 中,您现在可以使用更多元数据/参数。例如,您可以考虑:
资源的类型、位置、所有者、价值、部门...
上下文信息,例如一天中的时间用户尝试对资源进行的操作
所有这些都称为属性。属性是ABAC的基础,因此得名。您可以将这些属性组合到策略中。政策有点像 ABAC 的秘方。策略可以授予和拒绝访问。例如:
策略可用于表达高级场景,例如
有两种主要的语法可用于编写策略:
ABAC 还带有一个架构来定义如何评估和执行策略。
该架构包含以下组件:
策略执行点 (PEP):这是保护您要保护的 API/应用程序的组件。PEP 拦截流,对其进行分析,然后向 PDP 发送授权请求(见下文)。然后它收到一个决定(允许/拒绝),它会强制执行。
策略决策点 (PDP) 接收授权请求(例如,Alice 可以查看记录 #123 吗?)并根据已配置的策略集对其进行评估。它最终会做出一个决定,并将其发送回 PEP。在评估过程中,PDP 可能需要额外的元数据,例如用户的职位。为此,它可以求助于政策信息点 (PIP)
全面披露 - 我是 XACML 技术委员会的成员,并为Axiomatics工作,这是一个实现 XACML 的动态授权提供商。
Axiomatics 为其Axiomatics Policy Server提供了一个 Spring Security SDK ,它提供了四个表达式,可用于查询 PDP 作为保护方法调用的一部分
@PreAuthorize@PostAuthorize@PostFilter@PreFilter这些方法的确切签名如下:
xacmlDecisionPreAuthz(Collection<String> attributeCats,
Collection<String> attributeTypes, Collection<String> attributeIds,
ArrayList<Object> attributeValues)xacmlDecisionPostAuthz(Collection<String> attributeCats,
Collection<String> attributeTypes, Collection<String> attributeIds,
ArrayList<Object> 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)有关XACML 实现的完整列表,您可以在 Wikipedia 上查看此列表。
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |