浏览代码

Use AuthorizationProxy Interface for Class Proxying

Issue gh-15747
Josh Cummings 11 月之前
父节点
当前提交
927de0d3b8

+ 7 - 2
core/src/main/java/org/springframework/security/authorization/method/AuthorizationAdvisorProxyFactory.java

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