繁体   English   中英

从同一类中的另一个安全方法调用安全方法时,@ PreAuthorize不起作用

[英]@PreAuthorize not working when a secured method is called from another secured method in same class

@PreAuthorize    
public void methodA() {
methodB();
}

@PreAuthorize    
public void methodB() { 
}

这里methodA()是接口方法,而methodB()由methodA()调用。

Spring方法级别的安全性使用基于代理的Spring AOP。 这意味着对对象引用的方法调用将是对代理的调用,因此代理将能够委派@PreAuthorize该特定方法调用相关的所有拦截器(例如@PreAuthorize )。

但是,一旦调用最终到达目标对象,它将针对此引用而不是代理调用它可能对其自身进行的任何方法调用。 这意味着自调用不会导致与方法调用相关的建议得到执行的机会。

您可以在此处找到更多详细信息。

基本上,它可以工作,但是不建议这样做。 理想情况下,您应该更改设计逻辑。 这是JVM运行时的代码。

@PreAuthorize    
public void methodA() {
this.methodB();
}

 @PreAuthorize    
public void methodB() { 
 }

首先,为什么它不起作用:

Spring方法级别的安全性使用的是基于Spring AOP的代理,这意味着每当您调用一个方法时,都会在Proxy对象(不是在Actual Object上)上调用该方法,并且此对象保存Spring上下文并允许您进行预授权。

但是,当控制权从代理调用的方法到达时,任何在内部对象中调用的方法都会在不包含Spring上下文的实际对象(this)上调用。 因此,它不对方法执行任何预授权。

基本上,您的代码是将methodB()调用为this.methodB() ,它位于实际对象上。 如果您能以某种方式(通过反射API或应用程序上下文)获得相同的代理,则可以通过以下代码执行所需的操作(不是实际的实现,而是一个想法)。

@PreAuthorize    
public void methodA() {
proxyObject.methodB();
}

 @PreAuthorize    
public void methodB() { 
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM