Преглед на файлове

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

Colin Sampaleanu преди 21 години
родител
ревизия
ab9e783f79
променени са 1 файла, в които са добавени 16 реда и са изтрити 13 реда
  1. 16 13
      core/src/main/java/org/acegisecurity/intercept/AbstractSecurityInterceptor.java

+ 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()) {