我不理解保留策略的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还提供了一个架构,用于定义如何评估和实施策略.
该体系结构包含以下组件:
>策略执行点(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.