| 
					
				 | 
			
			
				@@ -129,7 +129,7 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean, A 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * completed. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param token as returned by the {@link #beforeInvocation(Object)}} method 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     * @param returnedObject any object returned from the secure object invocation (may be<tt>null</tt>) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param returnedObject any object returned from the secure object invocation (may be <tt>null</tt>) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @return the object the secure object invocation should ultimately return to its caller (may be <tt>null</tt>) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     protected Object afterInvocation(InterceptorStatusToken token, Object returnedObject) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -188,7 +188,7 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean, A 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (attributeDefs == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 logger.warn("Could not validate configuration attributes as the ObjectDefinitionSource did not return " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        + "a ConfigAttributeDefinition Iterator"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        + "a ConfigAttributeDefinition collection"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -247,7 +247,7 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean, A 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (logger.isDebugEnabled()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            logger.debug("Secure object: " + object.toString() + "; ConfigAttributes: " + attr.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logger.debug("Secure object: " + object + "; ConfigAttributes: " + attr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (SecurityContextHolder.getContext().getAuthentication() == null) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -255,28 +255,7 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean, A 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     "An Authentication object was not found in the SecurityContext"), object, attr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Attempt authentication if not already authenticated, or user always 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // wants reauthentication 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Authentication authenticated; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (!SecurityContextHolder.getContext().getAuthentication().isAuthenticated() || alwaysReauthenticate) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            authenticated = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.authenticationManager.authenticate(SecurityContextHolder.getContext().getAuthentication()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // We don't authenticated.setAuthentication(true), because each 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // provider should do that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (logger.isDebugEnabled()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                logger.debug("Successfully Authenticated: " + authenticated.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            SecurityContextHolder.getContext().setAuthentication(authenticated); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            authenticated = SecurityContextHolder.getContext().getAuthentication(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (logger.isDebugEnabled()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                logger.debug("Previously Authenticated: " + authenticated.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Authentication authenticated = authenticateIfRequired(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // Attempt authorization 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -309,7 +288,7 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean, A 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return new InterceptorStatusToken(authenticated, false, attr, object); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (logger.isDebugEnabled()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                logger.debug("Switching to RunAs Authentication: " + runAs.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                logger.debug("Switching to RunAs Authentication: " + runAs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             SecurityContextHolder.getContext().setAuthentication(runAs); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -319,6 +298,36 @@ public abstract class AbstractSecurityInterceptor implements InitializingBean, A 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * Checks the current authentication token and passes it to the AuthenticationManager if 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * {@link org.springframework.security.Authentication#isAuthenticated()} returns false or the property 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * <tt>alwaysReauthenticate</tt> has been set to true. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return an authenticated <tt>Authentication</tt> object. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Authentication authenticateIfRequired() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (authentication.isAuthenticated() && !alwaysReauthenticate) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (logger.isDebugEnabled()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                logger.debug("Previously Authenticated: " + authentication); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return authentication; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        authentication = authenticationManager.authenticate(authentication); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // We don't authenticated.setAuthentication(true), because each provider should do that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (logger.isDebugEnabled()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logger.debug("Successfully Authenticated: " + authentication); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        SecurityContextHolder.getContext().setAuthentication(authentication); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return authentication; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * Helper method which generates an exception containing the passed reason, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * and publishes an event to the application context. 
			 |