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

时间:2014-10-14 13:23:33

标签: java spring-security

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

@PreAuthorize    
public void methodB() { 
}

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

4 个答案:

答案 0 :(得分:1)

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

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

您可以找到更多详情here

答案 1 :(得分:0)

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

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

 @PreAuthorize    
public void methodB() { 
 }

首先是为什么它无效:

Spring方法级安全性使用基于Spring AOP的代理,这意味着无论何时调用方法,都会在代理对象(不在实际对象上)上调用它,并且此对象包含Spring上下文并允许您进行预授权。

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

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

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

 @PreAuthorize    
public void methodB() { 
 }

答案 2 :(得分:0)

我被困在同样的情况很长一段时间里,一个 Spring AOP 只被调用一次,然后实际的对象被无拦截地调用。

我通过自我依赖注入解决了这个问题。

@Autowired
private Classname self;

现在要调用实际对象,通过 self 对象调用类似的东西;

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

@PreAuthorize    
public void methodB() { 
   
}

答案 3 :(得分:0)

在spring boot中我解决了这个问题

MyService service = applicationContext.getBean(MyService.class);
service.methodB();
相关问题