如何在使用spring security annotations时调用不安全的代理?

时间:2013-03-13 07:48:41

标签: spring-security

我在项目中使用spring security注释。有些情况下,我想调用带注释对象的无安全版本。默认情况下,Spring会为注释对象创建一个启用安全性的代理,并将其用于代码中的自动装配,有什么办法可以使用spring实现这一点吗? 一个显而易见的方法是手动创建对应于每个类的代理类,我希望这个特性对这些方法进行注释,并且这些方法的实现只是将它委托给实际的对象。

1 个答案:

答案 0 :(得分:0)

作为JDK代理的一个选项,您可以在运行时获取实际的bean:

MyBean proxy;    
if(AopUtils.isJdkDynamicProxy(proxy)) {
    MyBean actualInstance = (MyBean) ((Advised)proxy).getTargetSource().getTarget()
}

actualInstance.doSomethingSecured(); // no advice related to this method will be called
// so your security annotation will be ignored (transactions, cache, and everething that requires AOP too...)

但从架构的角度来看,使用手动代理的方法看起来不那么错误(除非你绝对确定你不需要安全性和所有其他可能的方面)。

您可以使用泛型来提高可读性:

MyBean actualInstance = extractProxyTarget(proxy, proxy.getClass());
actualInstance.doSomethingSecured();