用于多种方法的MethodSecurityInterceptor
我想使用Spring Security保护我的服务层。如文档中所述,我需要使用a
MethodSecurityInterceptor
来检查是否允许方法调用。
要确定是否允许给定用户调用服务方法,对我来说影响对调用的方法的必需角色(使用MethodSecurityMetadataSource
)是不够的,因为这也取决于传递给方法的参数。如文档中所建议,我可以编写一个自定义AccessDecisionVoter
并通过安全对象访问参数(MethodInvocation
在这种情况下)。
但是,我的授权逻辑在所有方法中都不同。例如,多个方法之间的参数可能不同,并且授权逻辑也将不同。
我看到两个选择:
- 我可以在中使用条件逻辑
AccessDecisionVoter
来确定要使用的调用方法和授权逻辑,但这似乎是一个丑陋的解决方案。 - 我可以为
MethodSecurityInterceptor
每种方法定义一种以确保安全。根据Spring文档,aMethodSecurityInterceptor
用于保护许多方法,因此让我想到了另一种方法。
方法调用(使用AfterInvocationProvider
)后的访问决策也存在相同的问题。
有哪些选择?
回答:
您可以基于Spring @PreAuthorize("")
构造实现自己的方法安全注释。
要将有关方法的其他信息(方法参数值之外)获取到SpEL评估上下文,您可以实现自己的MethodSecurityExpressionHandler
@Servicepublic class MySecurityExpressionHandler extends
DefaultMethodSecurityExpressionHandler {
@Override
public StandardEvaluationContext createEvaluationContextInternal(
Authentication auth, MethodInvocation mi) {
StandardEvaluationContext evaluationContext = super
.createEvaluationContextInternal(auth, mi);
SomeMethodInfoData methodInfoData = mi.getMethod(). ...;
evaluationContext.setVariable("someData", <value computed based on method info data>);
}
return evaluationContext;
}
并在您的global-method-security
声明中注册
<security:global-method-security pre-post-annotations="enabled">
<security:expression-handler
ref="mySecurityExpressionHandler" />
</security:global-method-security>
现在,您可以创建自定义安全注释(如果需要,还可以在MySecurityExpressionHandler中创建额外的过程注释数据)
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("#<someData>")
public @interface CustomSecurityAnnotation { ... }
例如,您可以创建一个自定义注释来检查用户角色而不会弄乱字符串:
@MyUserRoleCheck(MyAppRole.Admin)public void someMethod()
以上是 用于多种方法的MethodSecurityInterceptor 的全部内容, 来源链接: utcz.com/qa/418089.html