Browse Source

SEC-618: Moved copyDetails method down to ProviderManager so that it can be called prior to checking if authentication is allowed by ConcurrentSessionController.

Luke Taylor 17 năm trước cách đây
mục cha
commit
4984024314

+ 5 - 25
core/src/main/java/org/springframework/security/AbstractAuthenticationManager.java

@@ -15,9 +15,6 @@
 
 package org.springframework.security;
 
-import org.springframework.security.providers.AbstractAuthenticationToken;
-
-
 /**
  * An abstract implementation of the {@link AuthenticationManager}.
  *
@@ -43,10 +40,7 @@ public abstract class AbstractAuthenticationManager implements AuthenticationMan
     public final Authentication authenticate(Authentication authRequest)
         throws AuthenticationException {
         try {
-            Authentication authResult = doAuthentication(authRequest);
-            copyDetails(authRequest, authResult);
-
-            return authResult;
+            return doAuthentication(authRequest);
         } catch (AuthenticationException e) {
             e.setAuthentication(authRequest);
             throw e;
@@ -54,24 +48,10 @@ public abstract class AbstractAuthenticationManager implements AuthenticationMan
     }
 
     /**
-     * Copies the authentication details from a source Authentication object to a destination one, provided the
-     * latter does not already have one set.
-     *
-     * @param source source authentication
-     * @param dest the destination authentication object
-     */
-    private void copyDetails(Authentication source, Authentication dest) {
-        if ((dest instanceof AbstractAuthenticationToken) && (dest.getDetails() == null)) {
-            AbstractAuthenticationToken token = (AbstractAuthenticationToken) dest;
-
-            token.setDetails(source.getDetails());
-        }
-    }
-
-    /**
-     * <p>Concrete implementations of this class override this method to provide the authentication service.</p>
-     *  <p>The contract for this method is documented in the {@link
-     * AuthenticationManager#authenticate(org.springframework.security.Authentication)}.</p>
+     * Concrete implementations of this class override this method to provide the authentication service.
+     * <p>
+     * The contract for this method is documented in the
+     * {@link AuthenticationManager#authenticate(org.springframework.security.Authentication)}.
      *
      * @param authentication the authentication request object
      *

+ 16 - 0
core/src/main/java/org/springframework/security/providers/ProviderManager.java

@@ -200,6 +200,7 @@ public class ProviderManager extends AbstractAuthenticationManager implements In
 
                 try {
                     result = provider.authenticate(authentication);
+                    copyDetails(authentication, result);
                     sessionController.checkAuthenticationAllowed(result);
                 } catch (AuthenticationException ae) {
                     lastException = ae;
@@ -252,6 +253,21 @@ public class ProviderManager extends AbstractAuthenticationManager implements In
         throw lastException;
     }
 
+    /**
+     * Copies the authentication details from a source Authentication object to a destination one, provided the
+     * latter does not already have one set.
+     *
+     * @param source source authentication
+     * @param dest the destination authentication object
+     */
+    private void copyDetails(Authentication source, Authentication dest) {
+        if ((dest instanceof AbstractAuthenticationToken) && (dest.getDetails() == null)) {
+            AbstractAuthenticationToken token = (AbstractAuthenticationToken) dest;
+
+            token.setDetails(source.getDetails());
+        }
+    }
+
     public List getProviders() {
         return this.providers;
     }