Use AuthorizationProxy Interface for Class Proxying

Issue gh-15747
This commit is contained in:
Josh Cummings 2024-09-10 07:58:21 -06:00
parent 2ff29dc229
commit 927de0d3b8
No known key found for this signature in database
GPG Key ID: A306A51F43B8E5A5

View File

@ -91,6 +91,8 @@ public final class AuthorizationAdvisorProxyFactory
private static final TargetVisitor DEFAULT_VISITOR_SKIP_VALUE_TYPES = TargetVisitor.of(new ClassVisitor(), private static final TargetVisitor DEFAULT_VISITOR_SKIP_VALUE_TYPES = TargetVisitor.of(new ClassVisitor(),
new IgnoreValueTypeVisitor(), DEFAULT_VISITOR); new IgnoreValueTypeVisitor(), DEFAULT_VISITOR);
private final AuthorizationProxyMethodInterceptor authorizationProxy = new AuthorizationProxyMethodInterceptor();
private List<AuthorizationAdvisor> advisors; private List<AuthorizationAdvisor> advisors;
private TargetVisitor visitor = DEFAULT_VISITOR; private TargetVisitor visitor = DEFAULT_VISITOR;
@ -172,8 +174,7 @@ public final class AuthorizationAdvisorProxyFactory
return proxied; return proxied;
} }
ProxyFactory factory = new ProxyFactory(target); ProxyFactory factory = new ProxyFactory(target);
AuthorizationProxyMethodInterceptor unwrapper = new AuthorizationProxyMethodInterceptor(); factory.addAdvisors(this.authorizationProxy);
factory.addAdvisors(unwrapper);
for (Advisor advisor : this.advisors) { for (Advisor advisor : this.advisors) {
factory.addAdvisors(advisor); factory.addAdvisors(advisor);
} }
@ -359,6 +360,8 @@ public final class AuthorizationAdvisorProxyFactory
private static final class ClassVisitor implements TargetVisitor { private static final class ClassVisitor implements TargetVisitor {
private final AuthorizationProxyMethodInterceptor authorizationProxy = new AuthorizationProxyMethodInterceptor();
@Override @Override
public Object visit(AuthorizationAdvisorProxyFactory proxyFactory, Object object) { public Object visit(AuthorizationAdvisorProxyFactory proxyFactory, Object object) {
if (object instanceof Class<?> targetClass) { if (object instanceof Class<?> targetClass) {
@ -367,9 +370,11 @@ public final class AuthorizationAdvisorProxyFactory
factory.setInterfaces(ClassUtils.getAllInterfacesForClass(targetClass)); factory.setInterfaces(ClassUtils.getAllInterfacesForClass(targetClass));
factory.setOpaque(true); factory.setOpaque(true);
factory.setProxyTargetClass(!Modifier.isFinal(targetClass.getModifiers())); factory.setProxyTargetClass(!Modifier.isFinal(targetClass.getModifiers()));
factory.addAdvisor(this.authorizationProxy);
for (Advisor advisor : proxyFactory) { for (Advisor advisor : proxyFactory) {
factory.addAdvisors(advisor); factory.addAdvisors(advisor);
} }
factory.addInterface(AuthorizationProxy.class);
return factory.getProxyClass(getClass().getClassLoader()); return factory.getProxyClass(getClass().getClassLoader());
} }
return null; return null;