Parcourir la source

after invocation, restore pre-RunAs Authentication regardless of exception that may be thrown by method being intercepted

Colin Sampaleanu il y a 21 ans
Parent
commit
ab9e783f79

+ 16 - 13
core/src/main/java/org/acegisecurity/intercept/AbstractSecurityInterceptor.java

@@ -320,21 +320,24 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean {
                     logger.debug("Switching to RunAs Authentication: "
                         + runAs.toString());
                 }
+                
+                SecureContext origSecureContext = null;
+                try {
+                    origSecureContext = (SecureContext) ContextHolder.getContext();
+                    context.setAuthentication(runAs);
+                    ContextHolder.setContext((Context) context);
 
-                context.setAuthentication(runAs);
-                ContextHolder.setContext((Context) context);
-
-                Object ret = callback.proceedWithObject(object);
-
-                if (logger.isDebugEnabled()) {
-                    logger.debug("Reverting to original Authentication: "
-                        + authenticated.toString());
+                    return callback.proceedWithObject(object);
+                }
+                finally {
+                    if (logger.isDebugEnabled()) {
+                        logger.debug("Reverting to original Authentication: "
+                            + authenticated.toString());
+                    }
+                    
+                    origSecureContext.setAuthentication(authenticated);
+                    ContextHolder.setContext(origSecureContext);
                 }
-
-                context.setAuthentication(authenticated);
-                ContextHolder.setContext((Context) context);
-
-                return ret;
             }
         } else {
             if (logger.isDebugEnabled()) {