Browse Source

SEC-1231: Authentication.getAuthorities should be of type Collection<GrantedAuthority> and not List<GrantedAuthority>. Refactored the interface and related classes to match (UserDetails etc).

Luke Taylor 16 năm trước cách đây
mục cha
commit
caff3ee9ba
64 tập tin đã thay đổi với 296 bổ sung355 xóa
  1. 2 6
      acl/src/main/java/org/springframework/security/acls/domain/AclAuthorizationStrategyImpl.java
  2. 2 1
      acl/src/main/java/org/springframework/security/acls/domain/SidRetrievalStrategyImpl.java
  3. 4 15
      cas/src/main/java/org/springframework/security/cas/authentication/CasAuthenticationToken.java
  4. 2 2
      cas/src/test/java/org/springframework/security/cas/authentication/CasAuthenticationProviderTests.java
  5. 3 3
      cas/src/test/java/org/springframework/security/cas/authentication/CasAuthenticationTokenTests.java
  6. 2 2
      core/src/main/java/org/springframework/security/access/expression/SecurityExpressionRoot.java
  7. 2 2
      core/src/main/java/org/springframework/security/access/hierarchicalroles/NullRoleHierarchy.java
  8. 2 2
      core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchy.java
  9. 45 39
      core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImpl.java
  10. 4 3
      core/src/main/java/org/springframework/security/access/hierarchicalroles/UserDetailsWrapper.java
  11. 2 3
      core/src/main/java/org/springframework/security/access/intercept/RunAsUserToken.java
  12. 3 2
      core/src/main/java/org/springframework/security/access/vote/LabelBasedAclVoter.java
  13. 2 2
      core/src/main/java/org/springframework/security/access/vote/RoleHierarchyVoter.java
  14. 3 2
      core/src/main/java/org/springframework/security/access/vote/RoleVoter.java
  15. 11 9
      core/src/main/java/org/springframework/security/authentication/AbstractAuthenticationToken.java
  16. 2 10
      core/src/main/java/org/springframework/security/authentication/RememberMeAuthenticationToken.java
  17. 2 2
      core/src/main/java/org/springframework/security/authentication/UsernamePasswordAuthenticationToken.java
  18. 3 1
      core/src/main/java/org/springframework/security/authentication/rcp/RemoteAuthenticationManager.java
  19. 5 8
      core/src/main/java/org/springframework/security/authentication/rcp/RemoteAuthenticationManagerImpl.java
  20. 4 7
      core/src/main/java/org/springframework/security/authentication/rcp/RemoteAuthenticationProvider.java
  21. 2 2
      core/src/main/java/org/springframework/security/core/Authentication.java
  22. 4 3
      core/src/main/java/org/springframework/security/core/authority/AuthorityUtils.java
  23. 4 3
      core/src/main/java/org/springframework/security/core/userdetails/User.java
  24. 2 2
      core/src/main/java/org/springframework/security/core/userdetails/UserDetails.java
  25. 7 7
      core/src/main/java/org/springframework/security/provisioning/JdbcUserDetailsManager.java
  26. 2 2
      core/src/test/java/org/springframework/security/access/expression/SecurityExpressionRootTests.java
  27. 5 4
      core/src/test/java/org/springframework/security/access/hierarchicalroles/HierarchicalRolesTestHelper.java
  28. 11 10
      core/src/test/java/org/springframework/security/access/hierarchicalroles/TestHelperTests.java
  29. 22 19
      core/src/test/java/org/springframework/security/access/intercept/RunAsManagerImplTests.java
  30. 1 2
      core/src/test/java/org/springframework/security/authentication/AbstractAuthenticationTokenTests.java
  31. 3 2
      core/src/test/java/org/springframework/security/authentication/TestingAuthenticationProviderTests.java
  32. 2 2
      core/src/test/java/org/springframework/security/authentication/UsernamePasswordAuthenticationTokenTests.java
  33. 2 2
      core/src/test/java/org/springframework/security/authentication/anonymous/AnonymousAuthenticationTokenTests.java
  34. 8 13
      core/src/test/java/org/springframework/security/authentication/dao/DaoAuthenticationProviderTests.java
  35. 5 6
      core/src/test/java/org/springframework/security/authentication/jaas/JaasAuthenticationProviderTests.java
  36. 6 16
      core/src/test/java/org/springframework/security/authentication/rcp/RemoteAuthenticationProviderTests.java
  37. 2 2
      core/src/test/java/org/springframework/security/authentication/rememberme/RememberMeAuthenticationTokenTests.java
  38. 2 2
      core/src/test/java/org/springframework/security/core/userdetails/UserTests.java
  39. 6 14
      core/src/test/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImplTests.java
  40. 3 2
      core/src/test/java/org/springframework/security/core/userdetails/memory/UserMapEditorTests.java
  41. 3 3
      ldap/src/main/java/org/springframework/security/ldap/authentication/LdapAuthenticationProvider.java
  42. 2 2
      ldap/src/main/java/org/springframework/security/ldap/authentication/NullLdapAuthoritiesPopulator.java
  43. 2 2
      ldap/src/main/java/org/springframework/security/ldap/authentication/UserDetailsServiceLdapAuthoritiesPopulator.java
  44. 2 1
      ldap/src/main/java/org/springframework/security/ldap/userdetails/DefaultLdapAuthoritiesPopulator.java
  45. 2 2
      ldap/src/main/java/org/springframework/security/ldap/userdetails/InetOrgPersonContextMapper.java
  46. 2 2
      ldap/src/main/java/org/springframework/security/ldap/userdetails/LdapAuthoritiesPopulator.java
  47. 13 10
      ldap/src/main/java/org/springframework/security/ldap/userdetails/LdapUserDetailsImpl.java
  48. 4 4
      ldap/src/main/java/org/springframework/security/ldap/userdetails/LdapUserDetailsManager.java
  49. 4 4
      ldap/src/main/java/org/springframework/security/ldap/userdetails/LdapUserDetailsMapper.java
  50. 2 2
      ldap/src/main/java/org/springframework/security/ldap/userdetails/PersonContextMapper.java
  51. 2 2
      ldap/src/main/java/org/springframework/security/ldap/userdetails/UserDetailsContextMapper.java
  52. 5 10
      ldap/src/test/java/org/springframework/security/ldap/authentication/LdapAuthenticationProviderTests.java
  53. 24 35
      ldap/src/test/java/org/springframework/security/ldap/populator/DefaultLdapAuthoritiesPopulatorTests.java
  54. 4 4
      ldap/src/test/java/org/springframework/security/ldap/populator/UserDetailsServiceLdapAuthoritiesPopulatorTests.java
  55. 1 4
      ldap/src/test/java/org/springframework/security/ldap/userdetails/LdapUserDetailsMapperTests.java
  56. 2 2
      ldap/src/test/java/org/springframework/security/ldap/userdetails/LdapUserDetailsServiceTests.java
  57. 2 1
      openid/src/main/java/org/springframework/security/openid/OpenIDAuthenticationToken.java
  58. 2 10
      web/src/main/java/org/springframework/security/web/authentication/preauth/PreAuthenticatedAuthenticationToken.java
  59. 2 2
      web/src/main/java/org/springframework/security/web/authentication/switchuser/SwitchUserAuthorityChanger.java
  60. 3 2
      web/src/main/java/org/springframework/security/web/authentication/switchuser/SwitchUserProcessingFilter.java
  61. 2 2
      web/src/main/java/org/springframework/security/web/servletapi/SecurityContextHolderAwareRequestWrapper.java
  62. 2 10
      web/src/test/java/org/springframework/security/web/authentication/AnonymousProcessingFilterTests.java
  63. 2 1
      web/src/test/java/org/springframework/security/web/authentication/preauth/PreAuthenticatedAuthenticationTokenTests.java
  64. 3 2
      web/src/test/java/org/springframework/security/web/authentication/switchuser/SwitchUserProcessingFilterTests.java

+ 2 - 6
acl/src/main/java/org/springframework/security/acls/domain/AclAuthorizationStrategyImpl.java

@@ -98,12 +98,8 @@ public class AclAuthorizationStrategyImpl implements AclAuthorizationStrategy {
         }
 
         // Iterate this principal's authorities to determine right
-        List<GrantedAuthority> auths = authentication.getAuthorities();
-
-        for (int i = 0; i < auths.size(); i++) {
-            if (requiredAuthority.equals(auths.get(i))) {
-                return;
-            }
+        if (authentication.getAuthorities().contains(requiredAuthority)) {
+            return;
         }
 
         // Try to get permission via ACEs within the ACL

+ 2 - 1
acl/src/main/java/org/springframework/security/acls/domain/SidRetrievalStrategyImpl.java

@@ -16,6 +16,7 @@
 package org.springframework.security.acls.domain;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import org.springframework.security.access.hierarchicalroles.NullRoleHierarchy;
@@ -51,7 +52,7 @@ public class SidRetrievalStrategyImpl implements SidRetrievalStrategy {
     //~ Methods ========================================================================================================
 
     public List<Sid> getSids(Authentication authentication) {
-        List<GrantedAuthority> authorities = roleHierarchy.getReachableGrantedAuthorities(authentication.getAuthorities());
+        Collection<GrantedAuthority> authorities = roleHierarchy.getReachableGrantedAuthorities(authentication.getAuthorities());
         List<Sid> sids = new ArrayList<Sid>(authorities.size() + 1);
 
         sids.add(new PrincipalSid(authentication));

+ 4 - 15
cas/src/main/java/org/springframework/security/cas/authentication/CasAuthenticationToken.java

@@ -15,17 +15,14 @@
 
 package org.springframework.security.cas.authentication;
 
-import org.jasig.cas.client.validation.Assertion;
+import java.io.Serializable;
+import java.util.Collection;
 
+import org.jasig.cas.client.validation.Assertion;
 import org.springframework.security.authentication.AbstractAuthenticationToken;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
 
-
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.List;
-
 /**
  * Represents a successful CAS <code>Authentication</code>.
  *
@@ -45,14 +42,6 @@ public class CasAuthenticationToken extends AbstractAuthenticationToken implemen
 
     //~ Constructors ===================================================================================================
 
-    /**
-     * @deprecated
-     */
-    public CasAuthenticationToken(final String key, final Object principal, final Object credentials,
-            final GrantedAuthority[] authorities, final UserDetails userDetails, final Assertion assertion) {
-        this(key, principal, credentials, Arrays.asList(authorities), userDetails, assertion);
-    }
-
     /**
      * Constructor.
      *
@@ -71,7 +60,7 @@ public class CasAuthenticationToken extends AbstractAuthenticationToken implemen
      * @throws IllegalArgumentException if a <code>null</code> was passed
      */
     public CasAuthenticationToken(final String key, final Object principal, final Object credentials,
-        final List<GrantedAuthority> authorities, final UserDetails userDetails, final Assertion assertion) {
+        final Collection<GrantedAuthority> authorities, final UserDetails userDetails, final Assertion assertion) {
         super(authorities);
 
         if ((key == null) || ("".equals(key)) || (principal == null) || "".equals(principal) || (credentials == null)

+ 2 - 2
cas/src/test/java/org/springframework/security/cas/authentication/CasAuthenticationProviderTests.java

@@ -98,8 +98,8 @@ public class CasAuthenticationProviderTests {
         CasAuthenticationToken casResult = (CasAuthenticationToken) result;
         assertEquals(makeUserDetailsFromAuthoritiesPopulator(), casResult.getPrincipal());
         assertEquals("ST-123", casResult.getCredentials());
-        assertEquals(new GrantedAuthorityImpl("ROLE_A"), casResult.getAuthorities().get(0));
-        assertEquals(new GrantedAuthorityImpl("ROLE_B"), casResult.getAuthorities().get(1));
+        assertTrue(casResult.getAuthorities().contains(new GrantedAuthorityImpl("ROLE_A")));
+        assertTrue(casResult.getAuthorities().contains(new GrantedAuthorityImpl("ROLE_B")));
         assertEquals(cap.getKey().hashCode(), casResult.getKeyHash());
         assertEquals("details", casResult.getDetails());
 

+ 3 - 3
cas/src/test/java/org/springframework/security/cas/authentication/CasAuthenticationTokenTests.java

@@ -22,9 +22,9 @@ import junit.framework.TestCase;
 import org.jasig.cas.client.validation.Assertion;
 import org.jasig.cas.client.validation.AssertionImpl;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.cas.authentication.CasAuthenticationToken;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.authority.GrantedAuthorityImpl;
 import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetails;
 
@@ -109,8 +109,8 @@ public class CasAuthenticationTokenTests extends TestCase {
         assertEquals("key".hashCode(), token.getKeyHash());
         assertEquals(makeUserDetails(), token.getPrincipal());
         assertEquals("Password", token.getCredentials());
-        assertEquals("ROLE_ONE", token.getAuthorities().get(0).getAuthority());
-        assertEquals("ROLE_TWO", token.getAuthorities().get(1).getAuthority());
+        assertTrue(token.getAuthorities().contains(new GrantedAuthorityImpl("ROLE_ONE")));
+        assertTrue(token.getAuthorities().contains(new GrantedAuthorityImpl("ROLE_TWO")));
         assertEquals(assertion, token.getAssertion());
         assertEquals(makeUserDetails().getUsername(), token.getUserDetails().getUsername());
     }

+ 2 - 2
core/src/main/java/org/springframework/security/access/expression/SecurityExpressionRoot.java

@@ -1,7 +1,7 @@
 package org.springframework.security.access.expression;
 
+import java.util.Collection;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
@@ -96,7 +96,7 @@ public abstract class SecurityExpressionRoot {
     private Set<String> getAuthoritySet() {
         if (roles == null) {
             roles = new HashSet<String>();
-            List<GrantedAuthority> userAuthorities = authentication.getAuthorities();
+            Collection<GrantedAuthority> userAuthorities = authentication.getAuthorities();
 
             if (roleHierarchy != null) {
                 userAuthorities = roleHierarchy.getReachableGrantedAuthorities(userAuthorities);

+ 2 - 2
core/src/main/java/org/springframework/security/access/hierarchicalroles/NullRoleHierarchy.java

@@ -1,6 +1,6 @@
 package org.springframework.security.access.hierarchicalroles;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.core.GrantedAuthority;
 
@@ -12,7 +12,7 @@ import org.springframework.security.core.GrantedAuthority;
  */
 public final class NullRoleHierarchy implements RoleHierarchy {
 
-    public List<GrantedAuthority> getReachableGrantedAuthorities(List<GrantedAuthority> authorities) {
+    public Collection<GrantedAuthority> getReachableGrantedAuthorities(Collection<GrantedAuthority> authorities) {
         return authorities;
     }
 

+ 2 - 2
core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchy.java

@@ -14,7 +14,7 @@
 
 package org.springframework.security.access.hierarchicalroles;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.core.GrantedAuthority;
 
@@ -40,6 +40,6 @@ public interface RoleHierarchy {
      * @param authorities - List of the directly assigned authorities.
      * @return List of all reachable authorities given the assigned authorities.
      */
-    public List<GrantedAuthority> getReachableGrantedAuthorities(List<GrantedAuthority> authorities);
+    public Collection<GrantedAuthority> getReachableGrantedAuthorities(Collection<GrantedAuthority> authorities);
 
 }

+ 45 - 39
core/src/main/java/org/springframework/security/access/hierarchicalroles/RoleHierarchyImpl.java

@@ -15,15 +15,21 @@
 package org.springframework.security.access.hierarchicalroles;
 
 
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.GrantedAuthorityImpl;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import java.util.*;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.GrantedAuthorityImpl;
 
 /**
  * <p>
@@ -98,7 +104,7 @@ public class RoleHierarchyImpl implements RoleHierarchy {
         buildRolesReachableInOneOrMoreStepsMap();
     }
 
-    public List<GrantedAuthority> getReachableGrantedAuthorities(List<GrantedAuthority> authorities) {
+    public Collection<GrantedAuthority> getReachableGrantedAuthorities(Collection<GrantedAuthority> authorities) {
         if (authorities == null || authorities.isEmpty()) {
             return null;
         }
@@ -125,40 +131,40 @@ public class RoleHierarchyImpl implements RoleHierarchy {
     }
 
     // SEC-863
-	private void addReachableRoles(Set<GrantedAuthority> reachableRoles,
-			GrantedAuthority authority) {
-		
-		Iterator<GrantedAuthority> iterator = reachableRoles.iterator();		
-		while (iterator.hasNext()) {
-			GrantedAuthority testAuthority = iterator.next(); 
-			String testKey = testAuthority.getAuthority();
-			if ((testKey != null) && (testKey.equals(authority.getAuthority()))) {
-				return;
-			}
-		}
-		reachableRoles.add(authority);
-	}
+    private void addReachableRoles(Set<GrantedAuthority> reachableRoles,
+            GrantedAuthority authority) {
+
+        Iterator<GrantedAuthority> iterator = reachableRoles.iterator();
+        while (iterator.hasNext()) {
+            GrantedAuthority testAuthority = iterator.next();
+            String testKey = testAuthority.getAuthority();
+            if ((testKey != null) && (testKey.equals(authority.getAuthority()))) {
+                return;
+            }
+        }
+        reachableRoles.add(authority);
+    }
 
     // SEC-863
-	private Set<GrantedAuthority> getRolesReachableInOneOrMoreSteps(
-			GrantedAuthority authority) {
-		
-		if (authority.getAuthority() == null) {
-			return null;
-		}
-		
-		Iterator<GrantedAuthority> iterator = rolesReachableInOneOrMoreStepsMap.keySet().iterator();		
-		while (iterator.hasNext()) {
-			GrantedAuthority testAuthority = iterator.next(); 
-			String testKey = testAuthority.getAuthority();
-			if ((testKey != null) && (testKey.equals(authority.getAuthority()))) {
-				return rolesReachableInOneOrMoreStepsMap.get(testAuthority);
-			}
-		}
-		
-		return null;
-	}
-    
+    private Set<GrantedAuthority> getRolesReachableInOneOrMoreSteps(
+            GrantedAuthority authority) {
+
+        if (authority.getAuthority() == null) {
+            return null;
+        }
+
+        Iterator<GrantedAuthority> iterator = rolesReachableInOneOrMoreStepsMap.keySet().iterator();
+        while (iterator.hasNext()) {
+            GrantedAuthority testAuthority = iterator.next();
+            String testKey = testAuthority.getAuthority();
+            if ((testKey != null) && (testKey.equals(authority.getAuthority()))) {
+                return rolesReachableInOneOrMoreStepsMap.get(testAuthority);
+            }
+        }
+
+        return null;
+    }
+
     /**
      * Parse input and build the map for the roles reachable in one step: the higher role will become a key that
      * references a set of the reachable lower roles.

+ 4 - 3
core/src/main/java/org/springframework/security/access/hierarchicalroles/UserDetailsWrapper.java

@@ -14,8 +14,9 @@
 
 package org.springframework.security.access.hierarchicalroles;
 
-import java.util.List;
+import java.util.Collection;
 
+import org.springframework.security.access.vote.RoleHierarchyVoter;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
 
@@ -48,7 +49,7 @@ public class UserDetailsWrapper implements UserDetails {
         return userDetails.isAccountNonLocked();
     }
 
-    public List<GrantedAuthority> getAuthorities() {
+    public Collection<GrantedAuthority> getAuthorities() {
         return roleHierarchy.getReachableGrantedAuthorities(userDetails.getAuthorities());
     }
 
@@ -72,4 +73,4 @@ public class UserDetailsWrapper implements UserDetails {
         return userDetails;
     }
 
-}
+}

+ 2 - 3
core/src/main/java/org/springframework/security/access/intercept/RunAsUserToken.java

@@ -16,8 +16,7 @@
 package org.springframework.security.access.intercept;
 
 import java.util.Arrays;
-import java.util.List;
-
+import java.util.Collection;
 
 import org.springframework.security.authentication.AbstractAuthenticationToken;
 import org.springframework.security.core.Authentication;
@@ -45,7 +44,7 @@ public class RunAsUserToken extends AbstractAuthenticationToken {
         this(key, principal, credentials, Arrays.asList(authorities), originalAuthentication);
     }
 
-    public RunAsUserToken(String key, Object principal, Object credentials, List<GrantedAuthority> authorities,
+    public RunAsUserToken(String key, Object principal, Object credentials, Collection<GrantedAuthority> authorities,
             Class<? extends Authentication> originalAuthentication) {
         super(authorities);
         this.keyHash = key.hashCode();

+ 3 - 2
core/src/main/java/org/springframework/security/access/vote/LabelBasedAclVoter.java

@@ -23,6 +23,7 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.springframework.security.access.ConfigAttribute;
 import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
 import org.springframework.util.Assert;
 
 
@@ -177,8 +178,8 @@ public class LabelBasedAclVoter extends AbstractAclVoter {
              */
             List<String> userLabels = new ArrayList<String>();
 
-            for (int i = 0; i < authentication.getAuthorities().size(); i++) {
-                String userLabel = authentication.getAuthorities().get(i).getAuthority();
+            for (GrantedAuthority authority : authentication.getAuthorities()) {
+                String userLabel = authority.getAuthority();
                 if (labelMap.containsKey(userLabel)) {
                     userLabels.add(userLabel);
                     logger.debug("Adding " + userLabel + " to <<<" + authentication.getName()

+ 2 - 2
core/src/main/java/org/springframework/security/access/vote/RoleHierarchyVoter.java

@@ -1,6 +1,6 @@
 package org.springframework.security.access.vote;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
 import org.springframework.security.core.Authentication;
@@ -26,7 +26,7 @@ public class RoleHierarchyVoter extends RoleVoter {
      * Calls the <tt>RoleHierarchy</tt> to obtain the complete set of user authorities.
      */
     @Override
-    List<GrantedAuthority> extractAuthorities(Authentication authentication) {
+    Collection<GrantedAuthority> extractAuthorities(Authentication authentication) {
         return roleHierarchy.getReachableGrantedAuthorities(authentication.getAuthorities());
     }
 }

+ 3 - 2
core/src/main/java/org/springframework/security/access/vote/RoleVoter.java

@@ -15,6 +15,7 @@
 
 package org.springframework.security.access.vote;
 
+import java.util.Collection;
 import java.util.List;
 
 import org.springframework.security.access.AccessDecisionVoter;
@@ -94,7 +95,7 @@ public class RoleVoter implements AccessDecisionVoter {
 
     public int vote(Authentication authentication, Object object, List<ConfigAttribute> attributes) {
         int result = ACCESS_ABSTAIN;
-        List<GrantedAuthority> authorities = extractAuthorities(authentication);
+        Collection<GrantedAuthority> authorities = extractAuthorities(authentication);
 
         for (ConfigAttribute attribute : attributes) {
             if (this.supports(attribute)) {
@@ -112,7 +113,7 @@ public class RoleVoter implements AccessDecisionVoter {
         return result;
     }
 
-    List<GrantedAuthority> extractAuthorities(Authentication authentication) {
+    Collection<GrantedAuthority> extractAuthorities(Authentication authentication) {
         return authentication.getAuthorities();
     }
 }

+ 11 - 9
core/src/main/java/org/springframework/security/authentication/AbstractAuthenticationToken.java

@@ -16,8 +16,9 @@
 package org.springframework.security.authentication;
 
 import java.security.Principal;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
-import java.util.List;
 
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.GrantedAuthority;
@@ -37,7 +38,7 @@ public abstract class AbstractAuthenticationToken implements Authentication {
     //~ Instance fields ================================================================================================
 
     private Object details;
-    private final List<GrantedAuthority> authorities;
+    private final Collection<GrantedAuthority> authorities;
     private boolean authenticated = false;
 
     //~ Constructors ===================================================================================================
@@ -52,17 +53,18 @@ public abstract class AbstractAuthenticationToken implements Authentication {
      *                    Authentication#getAuthorities()}<code>null</code> should only be
      *                    presented if the principal has not been authenticated).
      */
-    public AbstractAuthenticationToken(List<GrantedAuthority> authorities) {
+    public AbstractAuthenticationToken(Collection<GrantedAuthority> authorities) {
         if (authorities == null) {
             this.authorities = null;
         } else {
-            for (int i = 0; i < authorities.size(); i++) {
-                if(authorities.get(i) == null) {
-                    throw new IllegalArgumentException("Granted authority element " + i
-                            + " is null - GrantedAuthority[] cannot contain any null elements");
+            for (GrantedAuthority a: authorities) {
+                if(a == null) {
+                    throw new IllegalArgumentException("Authorities collection cannot contain any null elements");
                 }
             }
-            this.authorities = Collections.unmodifiableList(authorities);
+            ArrayList<GrantedAuthority> temp = new ArrayList<GrantedAuthority>(authorities.size());
+            temp.addAll(authorities);
+            this.authorities = Collections.unmodifiableList(temp);
         }
     }
 
@@ -116,7 +118,7 @@ public abstract class AbstractAuthenticationToken implements Authentication {
         return this.isAuthenticated() == test.isAuthenticated();
     }
 
-    public List<GrantedAuthority> getAuthorities() {
+    public Collection<GrantedAuthority> getAuthorities() {
         return authorities;
     }
 

+ 2 - 10
core/src/main/java/org/springframework/security/authentication/RememberMeAuthenticationToken.java

@@ -16,8 +16,7 @@
 package org.springframework.security.authentication;
 
 import java.io.Serializable;
-import java.util.Arrays;
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.core.GrantedAuthority;
 
@@ -39,13 +38,6 @@ public class RememberMeAuthenticationToken extends AbstractAuthenticationToken i
 
     //~ Constructors ===================================================================================================
 
-    /**
-     * @deprecated
-     */
-    public RememberMeAuthenticationToken(String key, Object principal, GrantedAuthority[] authorities) {
-        this(key, principal, Arrays.asList(authorities));
-    }
-
     /**
      * Constructor.
      *
@@ -55,7 +47,7 @@ public class RememberMeAuthenticationToken extends AbstractAuthenticationToken i
      *
      * @throws IllegalArgumentException if a <code>null</code> was passed
      */
-    public RememberMeAuthenticationToken(String key, Object principal, List<GrantedAuthority> authorities) {
+    public RememberMeAuthenticationToken(String key, Object principal, Collection<GrantedAuthority> authorities) {
         super(authorities);
 
         if ((key == null) || ("".equals(key)) || (principal == null) || "".equals(principal)) {

+ 2 - 2
core/src/main/java/org/springframework/security/authentication/UsernamePasswordAuthenticationToken.java

@@ -16,7 +16,7 @@
 package org.springframework.security.authentication;
 
 import java.util.Arrays;
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.core.GrantedAuthority;
 
@@ -69,7 +69,7 @@ public class UsernamePasswordAuthenticationToken extends AbstractAuthenticationT
      * @param credentials
      * @param authorities
      */
-    public UsernamePasswordAuthenticationToken(Object principal, Object credentials, List<GrantedAuthority> authorities) {
+    public UsernamePasswordAuthenticationToken(Object principal, Object credentials, Collection<GrantedAuthority> authorities) {
         super(authorities);
         this.principal = principal;
         this.credentials = credentials;

+ 3 - 1
core/src/main/java/org/springframework/security/authentication/rcp/RemoteAuthenticationManager.java

@@ -15,6 +15,8 @@
 
 package org.springframework.security.authentication.rcp;
 
+import java.util.Collection;
+
 import org.springframework.security.core.GrantedAuthority;
 
 
@@ -43,6 +45,6 @@ public interface RemoteAuthenticationManager {
      *
      * @throws RemoteAuthenticationException if the authentication failed.
      */
-    GrantedAuthority[] attemptAuthentication(String username, String password)
+    Collection<GrantedAuthority> attemptAuthentication(String username, String password)
         throws RemoteAuthenticationException;
 }

+ 5 - 8
core/src/main/java/org/springframework/security/authentication/rcp/RemoteAuthenticationManagerImpl.java

@@ -15,16 +15,13 @@
 
 package org.springframework.security.authentication.rcp;
 
-import java.util.List;
-
+import java.util.Collection;
 
+import org.springframework.beans.factory.InitializingBean;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.GrantedAuthority;
-
-import org.springframework.beans.factory.InitializingBean;
-
 import org.springframework.util.Assert;
 
 
@@ -48,14 +45,14 @@ public class RemoteAuthenticationManagerImpl implements RemoteAuthenticationMana
         Assert.notNull(this.authenticationManager, "authenticationManager is required");
     }
 
-    public GrantedAuthority[] attemptAuthentication(String username, String password)
+    public Collection<GrantedAuthority> attemptAuthentication(String username, String password)
             throws RemoteAuthenticationException {
         UsernamePasswordAuthenticationToken request = new UsernamePasswordAuthenticationToken(username, password);
 
         try {
-            List<GrantedAuthority> authorities = authenticationManager.authenticate(request).getAuthorities();
+            Collection<GrantedAuthority> authorities = authenticationManager.authenticate(request).getAuthorities();
 
-            return authorities == null ? null : authorities.toArray(new GrantedAuthority[authorities.size()]);
+            return authorities;
         } catch (AuthenticationException authEx) {
             throw new RemoteAuthenticationException(authEx.getMessage());
         }

+ 4 - 7
core/src/main/java/org/springframework/security/authentication/rcp/RemoteAuthenticationProvider.java

@@ -15,17 +15,14 @@
 
 package org.springframework.security.authentication.rcp;
 
-import java.util.Arrays;
-
+import java.util.Collection;
 
+import org.springframework.beans.factory.InitializingBean;
 import org.springframework.security.authentication.AuthenticationProvider;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.GrantedAuthority;
-
-import org.springframework.beans.factory.InitializingBean;
-
 import org.springframework.util.Assert;
 
 
@@ -62,9 +59,9 @@ public class RemoteAuthenticationProvider implements AuthenticationProvider, Ini
         throws AuthenticationException {
         String username = authentication.getPrincipal().toString();
         String password = authentication.getCredentials().toString();
-        GrantedAuthority[] authorities = remoteAuthenticationManager.attemptAuthentication(username, password);
+        Collection<GrantedAuthority> authorities = remoteAuthenticationManager.attemptAuthentication(username, password);
 
-        return new UsernamePasswordAuthenticationToken(username, password, Arrays.asList(authorities));
+        return new UsernamePasswordAuthenticationToken(username, password, authorities);
     }
 
     public RemoteAuthenticationManager getRemoteAuthenticationManager() {

+ 2 - 2
core/src/main/java/org/springframework/security/core/Authentication.java

@@ -18,7 +18,7 @@ package org.springframework.security.core;
 import java.io.Serializable;
 
 import java.security.Principal;
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -56,7 +56,7 @@ public interface Authentication extends Principal, Serializable {
      *
      * @return the authorities granted to the principal, or <code>null</code> if authentication has not been completed
      */
-    List<GrantedAuthority> getAuthorities();
+    Collection<GrantedAuthority> getAuthorities();
 
     /**
      * The credentials that prove the principal is correct. This is usually a password, but could be anything

+ 4 - 3
core/src/main/java/org/springframework/security/core/authority/AuthorityUtils.java

@@ -1,6 +1,7 @@
 package org.springframework.security.core.authority;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -35,10 +36,10 @@ public abstract class AuthorityUtils {
      * Converts an array of GrantedAuthority objects to a Set.
      * @return a Set of the Strings obtained from each call to GrantedAuthority.getAuthority()
      */
-    public static Set<String> authorityListToSet(List<GrantedAuthority> authorities) {
-        Set<String> set = new HashSet<String>(authorities.size());
+    public static Set<String> authorityListToSet(Collection<GrantedAuthority> userAuthorities) {
+        Set<String> set = new HashSet<String>(userAuthorities.size());
 
-        for (GrantedAuthority authority: authorities) {
+        for (GrantedAuthority authority: userAuthorities) {
             set.add(authority.getAuthority());
         }
 

+ 4 - 3
core/src/main/java/org/springframework/security/core/userdetails/User.java

@@ -17,6 +17,7 @@ package org.springframework.security.core.userdetails;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.SortedSet;
@@ -80,7 +81,7 @@ public class User implements UserDetails {
      *         <code>GrantedAuthority[]</code> array
      */
     public User(String username, String password, boolean enabled, boolean accountNonExpired,
-            boolean credentialsNonExpired, boolean accountNonLocked, List<GrantedAuthority> authorities) {
+            boolean credentialsNonExpired, boolean accountNonLocked, Collection<GrantedAuthority> authorities) {
 
         if (((username == null) || "".equals(username)) || (password == null)) {
             throw new IllegalArgumentException("Cannot pass null or empty values to constructor");
@@ -118,7 +119,7 @@ public class User implements UserDetails {
                 && (this.isEnabled() == user.isEnabled()));
     }
 
-    public List<GrantedAuthority> getAuthorities() {
+    public Collection<GrantedAuthority> getAuthorities() {
         return authorities;
     }
 
@@ -182,7 +183,7 @@ public class User implements UserDetails {
         return enabled;
     }
 
-    private static List<GrantedAuthority> sortAuthorities(List<GrantedAuthority> authorities) {
+    private static List<GrantedAuthority> sortAuthorities(Collection<GrantedAuthority> authorities) {
         Assert.notNull(authorities, "Cannot pass a null GrantedAuthority array");
         // Ensure array iteration order is predictable (as per UserDetails.getAuthorities() contract and SEC-xxx)
         SortedSet<GrantedAuthority> sorter = new TreeSet<GrantedAuthority>();

+ 2 - 2
core/src/main/java/org/springframework/security/core/userdetails/UserDetails.java

@@ -19,7 +19,7 @@ import org.springframework.security.core.Authentication;
 import org.springframework.security.core.GrantedAuthority;
 
 import java.io.Serializable;
-import java.util.List;
+import java.util.Collection;
 
 
 /**
@@ -60,7 +60,7 @@ public interface UserDetails extends Serializable {
      *
      * @return the authorities, sorted by natural key (never <code>null</code>)
      */
-    List<GrantedAuthority> getAuthorities();
+    Collection<GrantedAuthority> getAuthorities();
 
     /**
      * Returns the password used to authenticate the user. Cannot return <code>null</code>.

+ 7 - 7
core/src/main/java/org/springframework/security/provisioning/JdbcUserDetailsManager.java

@@ -25,6 +25,7 @@ import org.apache.commons.logging.LogFactory;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -171,9 +172,8 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
     }
 
     private void insertUserAuthorities(UserDetails user) {
-        for (int i=0; i < user.getAuthorities().size(); i++) {
-            getJdbcTemplate().update(createAuthoritySql,
-                    new Object[] {user.getUsername(), user.getAuthorities().get(i).getAuthority()});
+        for (GrantedAuthority auth : user.getAuthorities()) {
+            getJdbcTemplate().update(createAuthoritySql, user.getUsername(), auth.getAuthority());
         }
     }
 
@@ -437,12 +437,12 @@ public class JdbcUserDetailsManager extends JdbcDaoImpl implements UserDetailsMa
         validateAuthorities(user.getAuthorities());
     }
 
-    private void validateAuthorities(List<GrantedAuthority> authorities) {
+    private void validateAuthorities(Collection<GrantedAuthority> authorities) {
         Assert.notNull(authorities, "Authorities list must not be null");
 
-        for (int i=0; i < authorities.size(); i++) {
-            Assert.notNull(authorities.get(i), "Authorities list contains a null entry");
-            Assert.hasText(authorities.get(i).getAuthority(), "getAuthority() method must return a non-empty string");
+        for (GrantedAuthority authority : authorities) {
+            Assert.notNull(authority, "Authorities list contains a null entry");
+            Assert.hasText(authority.getAuthority(), "getAuthority() method must return a non-empty string");
         }
     }
 }

+ 2 - 2
core/src/test/java/org/springframework/security/access/expression/SecurityExpressionRootTests.java

@@ -2,7 +2,7 @@ package org.springframework.security.access.expression;
 
 import static org.junit.Assert.*;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.junit.Test;
 import org.springframework.security.access.hierarchicalroles.RoleHierarchy;
@@ -24,7 +24,7 @@ public class SecurityExpressionRootTests {
             new SecurityExpressionRoot(new TestingAuthenticationToken("joe", "pass", "A", "B")) {};
 
         root.setRoleHierarchy(new RoleHierarchy() {
-            public List<GrantedAuthority> getReachableGrantedAuthorities(List<GrantedAuthority> authorities) {
+            public Collection<GrantedAuthority> getReachableGrantedAuthorities(Collection<GrantedAuthority> authorities) {
                 return AuthorityUtils.createAuthorityList("C");
             }
         });

+ 5 - 4
core/src/test/java/org/springframework/security/access/hierarchicalroles/HierarchicalRolesTestHelper.java

@@ -15,6 +15,7 @@
 package org.springframework.security.access.hierarchicalroles;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import org.springframework.security.core.GrantedAuthority;
@@ -27,7 +28,7 @@ import org.apache.commons.collections.CollectionUtils;
  */
 public abstract class HierarchicalRolesTestHelper {
 
-    public static boolean containTheSameGrantedAuthorities(List<GrantedAuthority> authorities1, List<GrantedAuthority> authorities2) {
+    public static boolean containTheSameGrantedAuthorities(Collection<GrantedAuthority> authorities1, Collection<GrantedAuthority> authorities2) {
         if (authorities1 == null && authorities2 == null) {
             return true;
         }
@@ -38,7 +39,7 @@ public abstract class HierarchicalRolesTestHelper {
         return CollectionUtils.isEqualCollection(authorities1, authorities2);
     }
 
-    public static boolean containTheSameGrantedAuthoritiesCompareByAuthorityString(List<GrantedAuthority> authorities1, List<GrantedAuthority> authorities2) {
+    public static boolean containTheSameGrantedAuthoritiesCompareByAuthorityString(Collection<GrantedAuthority> authorities1, Collection<GrantedAuthority> authorities2) {
         if (authorities1 == null && authorities2 == null) {
             return true;
         }
@@ -46,10 +47,10 @@ public abstract class HierarchicalRolesTestHelper {
         if (authorities1 == null || authorities2 == null) {
             return false;
         }
-        return CollectionUtils.isEqualCollection(toListOfAuthorityStrings(authorities1), toListOfAuthorityStrings(authorities2));
+        return CollectionUtils.isEqualCollection(toCollectionOfAuthorityStrings(authorities1), toCollectionOfAuthorityStrings(authorities2));
     }
 
-    public static List<String> toListOfAuthorityStrings(List<GrantedAuthority> authorities) {
+    public static List<String> toCollectionOfAuthorityStrings(Collection<GrantedAuthority> authorities) {
         if (authorities == null) {
             return null;
         }

+ 11 - 10
core/src/test/java/org/springframework/security/access/hierarchicalroles/TestHelperTests.java

@@ -17,6 +17,7 @@ package org.springframework.security.access.hierarchicalroles;
 import static org.junit.Assert.*;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import org.apache.commons.collections.CollectionUtils;
@@ -56,11 +57,11 @@ public class TestHelperTests {
     // SEC-863
     @Test
     public void testToListOfAuthorityStrings() {
-        List<GrantedAuthority> authorities1 = AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_B");
-        List<GrantedAuthority> authorities2 = AuthorityUtils.createAuthorityList("ROLE_B", "ROLE_A");
-        List<GrantedAuthority> authorities3 = AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_C");
-        List<GrantedAuthority> authorities4 = AuthorityUtils.createAuthorityList("ROLE_A");
-        List<GrantedAuthority> authorities5 = AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_A");
+        Collection<GrantedAuthority> authorities1 = AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_B");
+        Collection<GrantedAuthority> authorities2 = AuthorityUtils.createAuthorityList("ROLE_B", "ROLE_A");
+        Collection<GrantedAuthority> authorities3 = AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_C");
+        Collection<GrantedAuthority> authorities4 = AuthorityUtils.createAuthorityList("ROLE_A");
+        Collection<GrantedAuthority> authorities5 = AuthorityUtils.createAuthorityList("ROLE_A", "ROLE_A");
 
         List<String> authoritiesStrings1 = new ArrayList<String>();
         authoritiesStrings1.add("ROLE_A");
@@ -82,19 +83,19 @@ public class TestHelperTests {
         authoritiesStrings5.add("ROLE_A");
 
         assertTrue(CollectionUtils.isEqualCollection(
-                HierarchicalRolesTestHelper.toListOfAuthorityStrings(authorities1),	authoritiesStrings1));
+                HierarchicalRolesTestHelper.toCollectionOfAuthorityStrings(authorities1),	authoritiesStrings1));
 
         assertTrue(CollectionUtils.isEqualCollection(
-                HierarchicalRolesTestHelper.toListOfAuthorityStrings(authorities2),	authoritiesStrings2));
+                HierarchicalRolesTestHelper.toCollectionOfAuthorityStrings(authorities2),	authoritiesStrings2));
 
         assertTrue(CollectionUtils.isEqualCollection(
-                HierarchicalRolesTestHelper.toListOfAuthorityStrings(authorities3),	authoritiesStrings3));
+                HierarchicalRolesTestHelper.toCollectionOfAuthorityStrings(authorities3),	authoritiesStrings3));
 
         assertTrue(CollectionUtils.isEqualCollection(
-                HierarchicalRolesTestHelper.toListOfAuthorityStrings(authorities4),	authoritiesStrings4));
+                HierarchicalRolesTestHelper.toCollectionOfAuthorityStrings(authorities4),	authoritiesStrings4));
 
         assertTrue(CollectionUtils.isEqualCollection(
-                HierarchicalRolesTestHelper.toListOfAuthorityStrings(authorities5),	authoritiesStrings5));
+                HierarchicalRolesTestHelper.toCollectionOfAuthorityStrings(authorities5),	authoritiesStrings5));
     }
 
     // SEC-863

+ 22 - 19
core/src/test/java/org/springframework/security/access/intercept/RunAsManagerImplTests.java

@@ -15,12 +15,11 @@
 
 package org.springframework.security.access.intercept;
 
+import java.util.Set;
+
 import junit.framework.TestCase;
 
 import org.springframework.security.access.SecurityConfig;
-import org.springframework.security.access.intercept.RunAsManager;
-import org.springframework.security.access.intercept.RunAsManagerImpl;
-import org.springframework.security.access.intercept.RunAsUserToken;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.authority.AuthorityUtils;
@@ -57,16 +56,18 @@ public class RunAsManagerImplTests extends TestCase {
         runAs.setKey("my_password");
         runAs.setRolePrefix("FOOBAR_");
 
-        Authentication resultingToken = runAs.buildRunAs(inputToken, new Object(), SecurityConfig.createList("RUN_AS_SOMETHING"));
+        Authentication result = runAs.buildRunAs(inputToken, new Object(), SecurityConfig.createList("RUN_AS_SOMETHING"));
+
+        assertTrue("Should have returned a RunAsUserToken", result instanceof RunAsUserToken);
+        assertEquals(inputToken.getPrincipal(), result.getPrincipal());
+        assertEquals(inputToken.getCredentials(), result.getCredentials());
+        Set<String> authorities = AuthorityUtils.authorityListToSet(result.getAuthorities());
 
-        assertTrue("Should have returned a RunAsUserToken", resultingToken instanceof RunAsUserToken);
-        assertEquals(inputToken.getPrincipal(), resultingToken.getPrincipal());
-        assertEquals(inputToken.getCredentials(), resultingToken.getCredentials());
-        assertEquals("FOOBAR_RUN_AS_SOMETHING", resultingToken.getAuthorities().get(0).getAuthority());
-        assertEquals("ONE", resultingToken.getAuthorities().get(1).getAuthority());
-        assertEquals("TWO", resultingToken.getAuthorities().get(2).getAuthority());
+        assertTrue(authorities.contains("FOOBAR_RUN_AS_SOMETHING"));
+        assertTrue(authorities.contains("ONE"));
+        assertTrue(authorities.contains("TWO"));
 
-        RunAsUserToken resultCast = (RunAsUserToken) resultingToken;
+        RunAsUserToken resultCast = (RunAsUserToken) result;
         assertEquals("my_password".hashCode(), resultCast.getKeyHash());
     }
 
@@ -77,19 +78,21 @@ public class RunAsManagerImplTests extends TestCase {
         RunAsManagerImpl runAs = new RunAsManagerImpl();
         runAs.setKey("my_password");
 
-        Authentication resultingToken = runAs.buildRunAs(inputToken, new Object(), SecurityConfig.createList("RUN_AS_SOMETHING"));
+        Authentication result = runAs.buildRunAs(inputToken, new Object(), SecurityConfig.createList("RUN_AS_SOMETHING"));
 
-        if (!(resultingToken instanceof RunAsUserToken)) {
+        if (!(result instanceof RunAsUserToken)) {
             fail("Should have returned a RunAsUserToken");
         }
 
-        assertEquals(inputToken.getPrincipal(), resultingToken.getPrincipal());
-        assertEquals(inputToken.getCredentials(), resultingToken.getCredentials());
-        assertEquals("ROLE_RUN_AS_SOMETHING", resultingToken.getAuthorities().get(0).getAuthority());
-        assertEquals("ROLE_ONE", resultingToken.getAuthorities().get(1).getAuthority());
-        assertEquals("ROLE_TWO", resultingToken.getAuthorities().get(2).getAuthority());
+        assertEquals(inputToken.getPrincipal(), result.getPrincipal());
+        assertEquals(inputToken.getCredentials(), result.getCredentials());
+
+        Set<String> authorities = AuthorityUtils.authorityListToSet(result.getAuthorities());
+        assertTrue(authorities.contains("ROLE_RUN_AS_SOMETHING"));
+        assertTrue(authorities.contains("ROLE_ONE"));
+        assertTrue(authorities.contains("ROLE_TWO"));
 
-        RunAsUserToken resultCast = (RunAsUserToken) resultingToken;
+        RunAsUserToken resultCast = (RunAsUserToken) result;
         assertEquals("my_password".hashCode(), resultCast.getKeyHash());
     }
 

+ 1 - 2
core/src/test/java/org/springframework/security/authentication/AbstractAuthenticationTokenTests.java

@@ -21,7 +21,6 @@ import java.util.List;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.springframework.security.authentication.AbstractAuthenticationToken;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.authority.AuthorityUtils;
 import org.springframework.security.core.authority.GrantedAuthorityImpl;
@@ -48,7 +47,7 @@ public class AbstractAuthenticationTokenTests {
     @Test(expected=UnsupportedOperationException.class)
     public void testAuthoritiesAreImmutable() {
         MockAuthenticationImpl token = new MockAuthenticationImpl("Test", "Password", authorities);
-        List<GrantedAuthority> gotAuthorities = token.getAuthorities();
+        List<GrantedAuthority> gotAuthorities = (List<GrantedAuthority>) token.getAuthorities();
         assertNotSame(authorities, gotAuthorities);
 
         gotAuthorities.set(0, new GrantedAuthorityImpl("ROLE_SUPER_USER"));

+ 3 - 2
core/src/test/java/org/springframework/security/authentication/TestingAuthenticationProviderTests.java

@@ -20,6 +20,7 @@ import junit.framework.TestCase;
 import org.springframework.security.authentication.TestingAuthenticationProvider;
 import org.springframework.security.authentication.TestingAuthenticationToken;
 import org.springframework.security.core.Authentication;
+import org.springframework.security.core.authority.AuthorityUtils;
 
 /**
  * Tests {@link TestingAuthenticationProvider}.
@@ -39,8 +40,8 @@ public class TestingAuthenticationProviderTests extends TestCase {
         TestingAuthenticationToken castResult = (TestingAuthenticationToken) result;
         assertEquals("Test", castResult.getPrincipal());
         assertEquals("Password", castResult.getCredentials());
-        assertEquals("ROLE_ONE", castResult.getAuthorities().get(0).getAuthority());
-        assertEquals("ROLE_TWO", castResult.getAuthorities().get(1).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(castResult.getAuthorities()).contains("ROLE_ONE"));
+        assertTrue(AuthorityUtils.authorityListToSet(castResult.getAuthorities()).contains("ROLE_TWO"));
     }
 
     public void testSupports() {

+ 2 - 2
core/src/test/java/org/springframework/security/authentication/UsernamePasswordAuthenticationTokenTests.java

@@ -68,8 +68,8 @@ public class UsernamePasswordAuthenticationTokenTests {
                 AuthorityUtils.createAuthorityList("ROLE_ONE", "ROLE_TWO"));
         assertEquals("Test", token.getPrincipal());
         assertEquals("Password", token.getCredentials());
-        assertEquals("ROLE_ONE", token.getAuthorities().get(0).getAuthority());
-        assertEquals("ROLE_TWO", token.getAuthorities().get(1).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(token.getAuthorities()).contains("ROLE_ONE"));
+        assertTrue(AuthorityUtils.authorityListToSet(token.getAuthorities()).contains("ROLE_TWO"));
     }
 
     @Test(expected=NoSuchMethodException.class)

+ 2 - 2
core/src/test/java/org/springframework/security/authentication/anonymous/AnonymousAuthenticationTokenTests.java

@@ -76,8 +76,8 @@ public class AnonymousAuthenticationTokenTests extends TestCase {
         assertEquals("key".hashCode(), token.getKeyHash());
         assertEquals("Test", token.getPrincipal());
         assertEquals("", token.getCredentials());
-        assertEquals("ROLE_ONE", token.getAuthorities().get(0).getAuthority());
-        assertEquals("ROLE_TWO", token.getAuthorities().get(1).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(token.getAuthorities()).contains("ROLE_ONE"));
+        assertTrue(AuthorityUtils.authorityListToSet(token.getAuthorities()).contains("ROLE_TWO"));
         assertTrue(token.isAuthenticated());
     }
 

+ 8 - 13
core/src/test/java/org/springframework/security/authentication/dao/DaoAuthenticationProviderTests.java

@@ -19,7 +19,8 @@ import java.util.List;
 
 import junit.framework.TestCase;
 
-
+import org.springframework.dao.DataAccessException;
+import org.springframework.dao.DataRetrievalFailureException;
 import org.springframework.security.authentication.AccountExpiredException;
 import org.springframework.security.authentication.AuthenticationServiceException;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -28,7 +29,6 @@ import org.springframework.security.authentication.DisabledException;
 import org.springframework.security.authentication.LockedException;
 import org.springframework.security.authentication.TestingAuthenticationToken;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
 import org.springframework.security.authentication.encoding.ShaPasswordEncoder;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.GrantedAuthority;
@@ -41,10 +41,6 @@ import org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache
 import org.springframework.security.core.userdetails.cache.NullUserCache;
 
 
-import org.springframework.dao.DataAccessException;
-import org.springframework.dao.DataRetrievalFailureException;
-
-
 /**
  * Tests {@link DaoAuthenticationProvider}.
  *
@@ -267,8 +263,8 @@ public class DaoAuthenticationProviderTests extends TestCase {
         UsernamePasswordAuthenticationToken castResult = (UsernamePasswordAuthenticationToken) result;
         assertEquals(User.class, castResult.getPrincipal().getClass());
         assertEquals("koala", castResult.getCredentials());
-        assertEquals("ROLE_ONE", castResult.getAuthorities().get(0).getAuthority());
-        assertEquals("ROLE_TWO", castResult.getAuthorities().get(1).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(castResult.getAuthorities()).contains("ROLE_ONE"));
+        assertTrue(AuthorityUtils.authorityListToSet(castResult.getAuthorities()).contains("ROLE_TWO"));
         assertEquals("192.168.0.1", castResult.getDetails());
     }
 
@@ -312,13 +308,12 @@ public class DaoAuthenticationProviderTests extends TestCase {
             fail("Should have returned instance of UsernamePasswordAuthenticationToken");
         }
 
-        UsernamePasswordAuthenticationToken castResult = (UsernamePasswordAuthenticationToken) result;
-        assertEquals(User.class, castResult.getPrincipal().getClass());
+        assertEquals(User.class, result.getPrincipal().getClass());
 
         // We expect original credentials user submitted to be returned
-        assertEquals("koala", castResult.getCredentials());
-        assertEquals("ROLE_ONE", castResult.getAuthorities().get(0).getAuthority());
-        assertEquals("ROLE_TWO", castResult.getAuthorities().get(1).getAuthority());
+        assertEquals("koala", result.getCredentials());
+        assertTrue(AuthorityUtils.authorityListToSet(result.getAuthorities()).contains("ROLE_ONE"));
+        assertTrue(AuthorityUtils.authorityListToSet(result.getAuthorities()).contains("ROLE_TWO"));
     }
 
     public void testAuthenticatesWithForcePrincipalAsString() {

+ 5 - 6
core/src/test/java/org/springframework/security/authentication/jaas/JaasAuthenticationProviderTests.java

@@ -23,6 +23,7 @@ import java.io.FileOutputStream;
 import java.io.PrintWriter;
 import java.net.URL;
 import java.security.Security;
+import java.util.Collection;
 import java.util.List;
 
 import javax.security.auth.login.LoginContext;
@@ -192,7 +193,7 @@ public class JaasAuthenticationProviderTests {
         assertNotNull(jaasProvider.getLoginConfig());
         assertNotNull(jaasProvider.getLoginContextName());
 
-        List<GrantedAuthority> list = auth.getAuthorities();
+        Collection<GrantedAuthority> list = auth.getAuthorities();
 
         assertTrue("GrantedAuthorities should contain ROLE_TEST1", list.contains(new GrantedAuthorityImpl("ROLE_TEST1")));
         assertTrue("GrantedAuthorities should contain ROLE_TEST2", list.contains(new GrantedAuthorityImpl("ROLE_TEST2")));
@@ -201,11 +202,9 @@ public class JaasAuthenticationProviderTests {
 
         boolean foundit = false;
 
-        for (int i = 0; i < list.size(); i++) {
-            Object obj = list.get(i);
-
-            if (obj instanceof JaasGrantedAuthority) {
-                JaasGrantedAuthority grant = (JaasGrantedAuthority) obj;
+        for (GrantedAuthority a : list) {
+            if (a instanceof JaasGrantedAuthority) {
+                JaasGrantedAuthority grant = (JaasGrantedAuthority) a;
                 assertNotNull("Principal was null on JaasGrantedAuthority", grant.getPrincipal());
                 foundit = true;
             }

+ 6 - 16
core/src/test/java/org/springframework/security/authentication/rcp/RemoteAuthenticationProviderTests.java

@@ -15,16 +15,14 @@
 
 package org.springframework.security.authentication.rcp;
 
-import junit.framework.TestCase;
+import java.util.Collection;
 
+import junit.framework.TestCase;
 
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.authentication.rcp.RemoteAuthenticationException;
-import org.springframework.security.authentication.rcp.RemoteAuthenticationManager;
-import org.springframework.security.authentication.rcp.RemoteAuthenticationProvider;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.GrantedAuthorityImpl;
+import org.springframework.security.core.authority.AuthorityUtils;
 
 
 /**
@@ -36,14 +34,6 @@ import org.springframework.security.core.authority.GrantedAuthorityImpl;
 public class RemoteAuthenticationProviderTests extends TestCase {
     //~ Methods ========================================================================================================
 
-    public static void main(String[] args) {
-        junit.textui.TestRunner.run(RemoteAuthenticationProviderTests.class);
-    }
-
-    public final void setUp() throws Exception {
-        super.setUp();
-    }
-
     public void testExceptionsGetPassedBackToCaller() {
         RemoteAuthenticationProvider provider = new RemoteAuthenticationProvider();
         provider.setRemoteAuthenticationManager(new MockRemoteAuthenticationManager(false));
@@ -85,7 +75,7 @@ public class RemoteAuthenticationProviderTests extends TestCase {
         Authentication result = provider.authenticate(new UsernamePasswordAuthenticationToken("rod", "password"));
         assertEquals("rod", result.getPrincipal());
         assertEquals("password", result.getCredentials());
-        assertEquals("foo", result.getAuthorities().get(0).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(result.getAuthorities()).contains("foo"));
     }
 
     public void testSupports() {
@@ -102,10 +92,10 @@ public class RemoteAuthenticationProviderTests extends TestCase {
             this.grantAccess = grantAccess;
         }
 
-        public GrantedAuthority[] attemptAuthentication(String username, String password)
+        public Collection<GrantedAuthority> attemptAuthentication(String username, String password)
             throws RemoteAuthenticationException {
             if (grantAccess) {
-                return new GrantedAuthority[] {new GrantedAuthorityImpl("foo")};
+                return AuthorityUtils.createAuthorityList("foo");
             } else {
                 throw new RemoteAuthenticationException("as requested");
             }

+ 2 - 2
core/src/test/java/org/springframework/security/authentication/rememberme/RememberMeAuthenticationTokenTests.java

@@ -75,8 +75,8 @@ public class RememberMeAuthenticationTokenTests extends TestCase {
         assertEquals("key".hashCode(), token.getKeyHash());
         assertEquals("Test", token.getPrincipal());
         assertEquals("", token.getCredentials());
-        assertEquals("ROLE_ONE", token.getAuthorities().get(0).getAuthority());
-        assertEquals("ROLE_TWO", token.getAuthorities().get(1).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(token.getAuthorities()).contains("ROLE_ONE"));
+        assertTrue(AuthorityUtils.authorityListToSet(token.getAuthorities()).contains("ROLE_TWO"));
         assertTrue(token.isAuthenticated());
     }
 

+ 2 - 2
core/src/test/java/org/springframework/security/core/userdetails/UserTests.java

@@ -106,8 +106,8 @@ public class UserTests extends TestCase {
         assertEquals("rod", user.getUsername());
         assertEquals("koala", user.getPassword());
         assertTrue(user.isEnabled());
-        assertEquals(new GrantedAuthorityImpl("ROLE_ONE"), user.getAuthorities().get(0));
-        assertEquals(new GrantedAuthorityImpl("ROLE_TWO"), user.getAuthorities().get(1));
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ROLE_ONE"));
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ROLE_TWO"));
         assertTrue(user.toString().indexOf("rod") != -1);
     }
 

+ 6 - 14
core/src/test/java/org/springframework/security/core/userdetails/jdbc/JdbcDaoImplTests.java

@@ -15,14 +15,12 @@
 
 package org.springframework.security.core.userdetails.jdbc;
 
-import java.util.HashSet;
-
 import junit.framework.TestCase;
 
 import org.springframework.security.PopulatedDatabase;
+import org.springframework.security.core.authority.AuthorityUtils;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl;
 
 
 /**
@@ -59,18 +57,15 @@ public class JdbcDaoImplTests extends TestCase {
         assertEquals("koala", user.getPassword());
         assertTrue(user.isEnabled());
 
-        HashSet<String> authorities = new HashSet<String>(2);
-        authorities.add(user.getAuthorities().get(0).getAuthority());
-        authorities.add(user.getAuthorities().get(1).getAuthority());
-        assertTrue(authorities.contains("ROLE_TELLER"));
-        assertTrue(authorities.contains("ROLE_SUPERVISOR"));
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ROLE_TELLER"));
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ROLE_SUPERVISOR"));
     }
 
     public void testCheckDaoOnlyReturnsGrantedAuthoritiesGrantedToUser() throws Exception {
         JdbcDaoImpl dao = makePopulatedJdbcDao();
         UserDetails user = dao.loadUserByUsername("scott");
-        assertEquals("ROLE_TELLER", user.getAuthorities().get(0).getAuthority());
         assertEquals(1, user.getAuthorities().size());
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ROLE_TELLER"));
     }
 
     public void testCheckDaoReturnsCorrectDisabledProperty() throws Exception {
@@ -124,11 +119,8 @@ public class JdbcDaoImplTests extends TestCase {
         assertEquals("rod", user.getUsername());
         assertEquals(2, user.getAuthorities().size());
 
-        HashSet<String> authorities = new HashSet<String>(2);
-        authorities.add(user.getAuthorities().get(0).getAuthority());
-        authorities.add(user.getAuthorities().get(1).getAuthority());
-        assertTrue(authorities.contains("ARBITRARY_PREFIX_ROLE_TELLER"));
-        assertTrue(authorities.contains("ARBITRARY_PREFIX_ROLE_SUPERVISOR"));
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ARBITRARY_PREFIX_ROLE_TELLER"));
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ARBITRARY_PREFIX_ROLE_SUPERVISOR"));
     }
 
     public void testGroupAuthoritiesAreLoadedCorrectly() throws Exception {

+ 3 - 2
core/src/test/java/org/springframework/security/core/userdetails/memory/UserMapEditorTests.java

@@ -17,6 +17,7 @@ package org.springframework.security.core.userdetails.memory;
 
 import junit.framework.TestCase;
 
+import org.springframework.security.core.authority.AuthorityUtils;
 import org.springframework.security.core.userdetails.memory.UserMap;
 import org.springframework.security.core.userdetails.memory.UserMapEditor;
 
@@ -63,8 +64,8 @@ public class UserMapEditorTests extends TestCase {
         UserMap map = (UserMap) editor.getValue();
         assertEquals("rod", map.getUser("rod").getUsername());
         assertEquals("koala", map.getUser("rod").getPassword());
-        assertEquals("ROLE_ONE", map.getUser("rod").getAuthorities().get(0).getAuthority());
-        assertEquals("ROLE_TWO", map.getUser("rod").getAuthorities().get(1).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(map.getUser("rod").getAuthorities()).contains("ROLE_ONE"));
+        assertTrue(AuthorityUtils.authorityListToSet(map.getUser("rod").getAuthorities()).contains("ROLE_TWO"));
         assertTrue(map.getUser("rod").isEnabled());
     }
 

+ 3 - 3
ldap/src/main/java/org/springframework/security/ldap/authentication/LdapAuthenticationProvider.java

@@ -15,7 +15,7 @@
 
 package org.springframework.security.ldap.authentication;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -252,7 +252,7 @@ public class LdapAuthenticationProvider implements AuthenticationProvider, Messa
         try {
             DirContextOperations userData = getAuthenticator().authenticate(authentication);
 
-            List<GrantedAuthority> extraAuthorities = loadUserAuthorities(userData, username, password);
+            Collection<GrantedAuthority> extraAuthorities = loadUserAuthorities(userData, username, password);
 
             UserDetails user = userDetailsContextMapper.mapUserFromContext(userData, username, extraAuthorities);
 
@@ -273,7 +273,7 @@ public class LdapAuthenticationProvider implements AuthenticationProvider, Messa
         }
     }
 
-    protected List<GrantedAuthority> loadUserAuthorities(DirContextOperations userData, String username, String password) {
+    protected Collection<GrantedAuthority> loadUserAuthorities(DirContextOperations userData, String username, String password) {
         return getAuthoritiesPopulator().getGrantedAuthorities(userData, username);
     }
 

+ 2 - 2
ldap/src/main/java/org/springframework/security/ldap/authentication/NullLdapAuthoritiesPopulator.java

@@ -1,6 +1,6 @@
 package org.springframework.security.ldap.authentication;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.ldap.core.DirContextOperations;
 import org.springframework.security.core.GrantedAuthority;
@@ -14,7 +14,7 @@ import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator;
  * @since 3.0
  */
 public final class NullLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator {
-    public List<GrantedAuthority> getGrantedAuthorities(DirContextOperations userDetails, String username) {
+    public Collection<GrantedAuthority> getGrantedAuthorities(DirContextOperations userDetails, String username) {
         return AuthorityUtils.NO_AUTHORITIES;
     }
 }

+ 2 - 2
ldap/src/main/java/org/springframework/security/ldap/authentication/UserDetailsServiceLdapAuthoritiesPopulator.java

@@ -1,6 +1,6 @@
 package org.springframework.security.ldap.authentication;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetailsService;
@@ -25,7 +25,7 @@ public class UserDetailsServiceLdapAuthoritiesPopulator implements LdapAuthoriti
         this.userDetailsService = userService;
     }
 
-    public List<GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username) {
+    public Collection<GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username) {
         return userDetailsService.loadUserByUsername(username).getAuthorities();
     }
 }

+ 2 - 1
ldap/src/main/java/org/springframework/security/ldap/userdetails/DefaultLdapAuthoritiesPopulator.java

@@ -29,6 +29,7 @@ import org.apache.commons.logging.LogFactory;
 import javax.naming.directory.SearchControls;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -172,7 +173,7 @@ public class DefaultLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator
      * @param user the user who's authorities are required
      * @return the set of roles granted to the user.
      */
-    public final List<GrantedAuthority> getGrantedAuthorities(DirContextOperations user, String username) {
+    public final Collection<GrantedAuthority> getGrantedAuthorities(DirContextOperations user, String username) {
         String userDn = user.getNameInNamespace();
 
         if (logger.isDebugEnabled()) {

+ 2 - 2
ldap/src/main/java/org/springframework/security/ldap/userdetails/InetOrgPersonContextMapper.java

@@ -14,7 +14,7 @@
  */
 package org.springframework.security.ldap.userdetails;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
@@ -29,7 +29,7 @@ import org.springframework.util.Assert;
  */
 public class InetOrgPersonContextMapper implements UserDetailsContextMapper {
 
-    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, List<GrantedAuthority> authorities) {
+    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<GrantedAuthority> authorities) {
         InetOrgPerson.Essence p = new InetOrgPerson.Essence(ctx);
 
         p.setUsername(username);

+ 2 - 2
ldap/src/main/java/org/springframework/security/ldap/userdetails/LdapAuthoritiesPopulator.java

@@ -15,7 +15,7 @@
 
 package org.springframework.security.ldap.userdetails;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.core.GrantedAuthority;
 
@@ -43,5 +43,5 @@ public interface LdapAuthoritiesPopulator {
      * @return the granted authorities for the given user.
      *
      */
-    List<GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username);
+    Collection<GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username);
 }

+ 13 - 10
ldap/src/main/java/org/springframework/security/ldap/userdetails/LdapUserDetailsImpl.java

@@ -16,7 +16,7 @@
 package org.springframework.security.ldap.userdetails;
 
 import java.util.ArrayList;
-import java.util.List;
+import java.util.Collection;
 
 import javax.naming.Name;
 
@@ -48,7 +48,7 @@ public class LdapUserDetailsImpl implements LdapUserDetails, PasswordPolicyData
     private String dn;
     private String password;
     private String username;
-    private List<GrantedAuthority> authorities = AuthorityUtils.NO_AUTHORITIES;
+    private Collection<GrantedAuthority> authorities = AuthorityUtils.NO_AUTHORITIES;
     private boolean accountNonExpired = true;
     private boolean accountNonLocked = true;
     private boolean credentialsNonExpired = true;
@@ -63,7 +63,7 @@ public class LdapUserDetailsImpl implements LdapUserDetails, PasswordPolicyData
 
     //~ Methods ========================================================================================================
 
-    public List<GrantedAuthority> getAuthorities() {
+    public Collection<GrantedAuthority> getAuthorities() {
         return authorities;
     }
 
@@ -104,7 +104,7 @@ public class LdapUserDetailsImpl implements LdapUserDetails, PasswordPolicyData
     }
 
     public String toString() {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append(super.toString()).append(": ");
         sb.append("Username: ").append(this.username).append("; ");
         sb.append("Password: [PROTECTED]; ");
@@ -115,13 +115,16 @@ public class LdapUserDetailsImpl implements LdapUserDetails, PasswordPolicyData
 
         if (this.getAuthorities() != null) {
             sb.append("Granted Authorities: ");
+            boolean first = true;
 
-            for (int i = 0; i < this.getAuthorities().size(); i++) {
-                if (i > 0) {
+            for (Object authority : this.getAuthorities()) {
+                if (first) {
+                    first = false;
+                } else {
                     sb.append(", ");
                 }
 
-                sb.append(this.getAuthorities().get(i).toString());
+                sb.append(authority.toString());
             }
         } else {
             sb.append("Not granted any authorities");
@@ -137,7 +140,7 @@ public class LdapUserDetailsImpl implements LdapUserDetails, PasswordPolicyData
      */
     public static class Essence {
         protected LdapUserDetailsImpl instance = createTarget();
-        private List<GrantedAuthority> mutableAuthorities = new ArrayList<GrantedAuthority>();
+        private Collection<GrantedAuthority> mutableAuthorities = new ArrayList<GrantedAuthority>();
 
         public Essence() { }
 
@@ -190,7 +193,7 @@ public class LdapUserDetailsImpl implements LdapUserDetails, PasswordPolicyData
             return newInstance;
         }
 
-        public List<GrantedAuthority> getGrantedAuthorities() {
+        public Collection<GrantedAuthority> getGrantedAuthorities() {
             return mutableAuthorities;
         }
 
@@ -202,7 +205,7 @@ public class LdapUserDetailsImpl implements LdapUserDetails, PasswordPolicyData
             instance.accountNonLocked = accountNonLocked;
         }
 
-        public void setAuthorities(List<GrantedAuthority> authorities) {
+        public void setAuthorities(Collection<GrantedAuthority> authorities) {
             mutableAuthorities = authorities;
         }
 

+ 4 - 4
ldap/src/main/java/org/springframework/security/ldap/userdetails/LdapUserDetailsManager.java

@@ -52,6 +52,7 @@ import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
 import javax.naming.ldap.LdapContext;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
@@ -315,7 +316,7 @@ public class LdapUserDetailsManager implements UserDetailsManager {
         userDetailsMapper.mapUserToContext(user, ctx);
     }
 
-    protected void addAuthorities(DistinguishedName userDn, List<GrantedAuthority> authorities) {
+    protected void addAuthorities(DistinguishedName userDn, Collection<GrantedAuthority> authorities) {
         modifyAuthorities(userDn, authorities, DirContext.ADD_ATTRIBUTE);
     }
 
@@ -323,11 +324,10 @@ public class LdapUserDetailsManager implements UserDetailsManager {
         modifyAuthorities(userDn, authorities, DirContext.REMOVE_ATTRIBUTE);
     }
 
-    private void modifyAuthorities(final DistinguishedName userDn, final List<GrantedAuthority> authorities, final int modType) {
+    private void modifyAuthorities(final DistinguishedName userDn, final Collection<GrantedAuthority> authorities, final int modType) {
         template.executeReadWrite(new ContextExecutor() {
             public Object executeWithContext(DirContext ctx) throws NamingException {
-                for(int i=0; i < authorities.size(); i++) {
-                    GrantedAuthority authority = authorities.get(i);
+                for(GrantedAuthority authority : authorities) {
                     String group = convertAuthorityToGroup(authority);
                     DistinguishedName fullDn = LdapUtils.getFullDn(userDn, ctx);
                     ModificationItem addGroup = new ModificationItem(modType,

+ 4 - 4
ldap/src/main/java/org/springframework/security/ldap/userdetails/LdapUserDetailsMapper.java

@@ -15,7 +15,7 @@
 
 package org.springframework.security.ldap.userdetails;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -46,7 +46,7 @@ public class LdapUserDetailsMapper implements UserDetailsContextMapper {
 
     //~ Methods ========================================================================================================
 
-    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, List<GrantedAuthority> authorities) {
+    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<GrantedAuthority> authorities) {
         String dn = ctx.getNameInNamespace();
 
         logger.debug("Mapping user details from context with DN: " + dn);
@@ -82,8 +82,8 @@ public class LdapUserDetailsMapper implements UserDetailsContextMapper {
 
         // Add the supplied authorities
 
-        for (int i=0; i < authorities.size(); i++) {
-            essence.addAuthority(authorities.get(i));
+        for (GrantedAuthority authority : authorities) {
+            essence.addAuthority(authority);
         }
 
         // Check for PPolicy data

+ 2 - 2
ldap/src/main/java/org/springframework/security/ldap/userdetails/PersonContextMapper.java

@@ -1,6 +1,6 @@
 package org.springframework.security.ldap.userdetails;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
@@ -14,7 +14,7 @@ import org.springframework.util.Assert;
  */
 public class PersonContextMapper implements UserDetailsContextMapper {
 
-    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, List<GrantedAuthority> authorities) {
+    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<GrantedAuthority> authorities) {
         Person.Essence p = new Person.Essence(ctx);
 
         p.setUsername(username);

+ 2 - 2
ldap/src/main/java/org/springframework/security/ldap/userdetails/UserDetailsContextMapper.java

@@ -14,7 +14,7 @@
  */
 package org.springframework.security.ldap.userdetails;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.userdetails.UserDetails;
@@ -39,7 +39,7 @@ public interface UserDetailsContextMapper {
      * @param authority the list of authorities which the user should be given.
      * @return the user object.
      */
-    UserDetails mapUserFromContext(DirContextOperations ctx, String username, List<GrantedAuthority> authority);
+    UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<GrantedAuthority> authority);
 
     /**
      * Reverse of the above operation. Populates a context object from the supplied user object.

+ 5 - 10
ldap/src/test/java/org/springframework/security/ldap/authentication/LdapAuthenticationProviderTests.java

@@ -17,8 +17,7 @@ package org.springframework.security.ldap.authentication;
 
 import static org.junit.Assert.*;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Collection;
 
 import org.jmock.Expectations;
 import org.jmock.Mockery;
@@ -128,12 +127,8 @@ public class LdapAuthenticationProviderTests {
         assertEquals("ben", user.getUsername());
         assertEquals("ben", populator.getRequestedUsername());
 
-        ArrayList<String> authorities = new ArrayList<String>();
-        authorities.add(user.getAuthorities().get(0).getAuthority());
-        authorities.add(user.getAuthorities().get(1).getAuthority());
-
-        assertTrue(authorities.contains("ROLE_FROM_ENTRY"));
-        assertTrue(authorities.contains("ROLE_FROM_POPULATOR"));
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ROLE_FROM_ENTRY"));
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ROLE_FROM_POPULATOR"));
     }
 
     @Test
@@ -157,7 +152,7 @@ public class LdapAuthenticationProviderTests {
         UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken("ben", "benspassword");
         UserDetails user = (UserDetails) ldapProvider.authenticate(authRequest).getPrincipal();
         assertEquals(1, user.getAuthorities().size());
-        assertEquals("ROLE_FROM_ENTRY", user.getAuthorities().get(0).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ROLE_FROM_ENTRY"));
     }
 
     //~ Inner Classes ==================================================================================================
@@ -189,7 +184,7 @@ public class LdapAuthenticationProviderTests {
     class MockAuthoritiesPopulator implements LdapAuthoritiesPopulator {
         String username;
 
-        public List<GrantedAuthority> getGrantedAuthorities(DirContextOperations userCtx, String username) {
+        public Collection<GrantedAuthority> getGrantedAuthorities(DirContextOperations userCtx, String username) {
             this.username = username;
             return AuthorityUtils.createAuthorityList("ROLE_FROM_POPULATOR");
         }

+ 24 - 35
ldap/src/test/java/org/springframework/security/ldap/populator/DefaultLdapAuthoritiesPopulatorTests.java

@@ -16,19 +16,18 @@
 package org.springframework.security.ldap.populator;
 
 
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.ldap.AbstractLdapIntegrationTests;
-import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator;
-
-import org.springframework.ldap.core.DirContextAdapter;
-import org.springframework.ldap.core.DistinguishedName;
+import static org.junit.Assert.*;
 
-import java.util.HashSet;
-import java.util.List;
+import java.util.Collection;
 import java.util.Set;
 
-import static org.junit.Assert.*;
 import org.junit.Test;
+import org.springframework.ldap.core.DirContextAdapter;
+import org.springframework.ldap.core.DistinguishedName;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.ldap.AbstractLdapIntegrationTests;
+import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator;
 
 
 /**
@@ -53,9 +52,9 @@ public class DefaultLdapAuthoritiesPopulatorTests extends AbstractLdapIntegratio
 
         DirContextAdapter ctx = new DirContextAdapter(new DistinguishedName("cn=notfound"));
 
-        List<GrantedAuthority> authorities = populator.getGrantedAuthorities(ctx, "notfound");
+        Collection<GrantedAuthority> authorities = populator.getGrantedAuthorities(ctx, "notfound");
         assertEquals(1, authorities.size());
-        assertEquals("ROLE_USER", authorities.get(0).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(authorities).contains("ROLE_USER"));
     }
 
     @Test
@@ -69,15 +68,12 @@ public class DefaultLdapAuthoritiesPopulatorTests extends AbstractLdapIntegratio
 
         DirContextAdapter ctx = new DirContextAdapter(new DistinguishedName("uid=ben,ou=people,dc=springframework,dc=org"));
 
-        List<GrantedAuthority> authorities = populator.getGrantedAuthorities(ctx, "ben");
+        Set<String> authorities = AuthorityUtils.authorityListToSet(populator.getGrantedAuthorities(ctx, "ben"));
 
         assertEquals("Should have 2 roles", 2, authorities.size());
 
-        Set<String> roles = new HashSet<String>();
-        roles.add(authorities.get(0).toString());
-        roles.add(authorities.get(1).toString());
-        assertTrue(roles.contains("ROLE_DEVELOPER"));
-        assertTrue(roles.contains("ROLE_MANAGER"));
+        assertTrue(authorities.contains("ROLE_DEVELOPER"));
+        assertTrue(authorities.contains("ROLE_MANAGER"));
     }
 
     @Test
@@ -88,10 +84,10 @@ public class DefaultLdapAuthoritiesPopulatorTests extends AbstractLdapIntegratio
 
         DirContextAdapter ctx = new DirContextAdapter(new DistinguishedName("uid=ben,ou=people,dc=springframework,dc=org"));
 
-        List<GrantedAuthority> authorities = populator.getGrantedAuthorities(ctx, "manager");
+        Set<String> authorities = AuthorityUtils.authorityListToSet(populator.getGrantedAuthorities(ctx, "manager"));
 
         assertEquals("Should have 1 role", 1, authorities.size());
-        assertEquals("ROLE_MANAGER", authorities.get(0).getAuthority());
+        assertTrue(authorities.contains("ROLE_MANAGER"));
     }
 
     @Test
@@ -101,14 +97,11 @@ public class DefaultLdapAuthoritiesPopulatorTests extends AbstractLdapIntegratio
 
         DirContextAdapter ctx = new DirContextAdapter(new DistinguishedName("uid=ben,ou=people,dc=springframework,dc=org"));
 
-        List<GrantedAuthority> authorities = populator.getGrantedAuthorities(ctx, "manager");
+        Set<String> authorities = AuthorityUtils.authorityListToSet(populator.getGrantedAuthorities(ctx, "manager"));
 
         assertEquals("Should have 2 roles", 2, authorities.size());
-        Set<String> roles = new HashSet<String>(2);
-        roles.add(authorities.get(0).getAuthority());
-        roles.add(authorities.get(1).getAuthority());
-        assertTrue(roles.contains("ROLE_MANAGER"));
-        assertTrue(roles.contains("ROLE_DEVELOPER"));
+        assertTrue(authorities.contains("ROLE_MANAGER"));
+        assertTrue(authorities.contains("ROLE_DEVELOPER"));
     }
 
     @Test
@@ -119,16 +112,12 @@ public class DefaultLdapAuthoritiesPopulatorTests extends AbstractLdapIntegratio
 
         DirContextAdapter ctx = new DirContextAdapter(new DistinguishedName("uid=ben,ou=people,dc=springframework,dc=org"));
 
-        List<GrantedAuthority> authorities = populator.getGrantedAuthorities(ctx, "manager");
+        Set<String> authorities = AuthorityUtils.authorityListToSet(populator.getGrantedAuthorities(ctx, "manager"));
 
         assertEquals("Should have 3 roles", 3, authorities.size());
-        Set<String> roles = new HashSet<String>(3);
-        roles.add(authorities.get(0).getAuthority());
-        roles.add(authorities.get(1).getAuthority());
-        roles.add(authorities.get(2).getAuthority());
-        assertTrue(roles.contains("ROLE_MANAGER"));
-        assertTrue(roles.contains("ROLE_DEVELOPER"));
-        assertTrue(roles.contains("ROLE_SUBMANAGER"));
+        assertTrue(authorities.contains("ROLE_MANAGER"));
+        assertTrue(authorities.contains("ROLE_SUBMANAGER"));
+        assertTrue(authorities.contains("ROLE_DEVELOPER"));
     }
 
     @Test
@@ -139,9 +128,9 @@ public class DefaultLdapAuthoritiesPopulatorTests extends AbstractLdapIntegratio
 
         DirContextAdapter ctx = new DirContextAdapter(new DistinguishedName("cn=mouse\\, jerry,ou=people,dc=springframework,dc=org"));
 
-        List<GrantedAuthority> authorities = populator.getGrantedAuthorities(ctx, "notused");
+        Set<String> authorities = AuthorityUtils.authorityListToSet(populator.getGrantedAuthorities(ctx, "notused"));
 
         assertEquals("Should have 1 role", 1, authorities.size());
-        assertEquals("ROLE_MANAGER", authorities.get(0).getAuthority());
+        assertTrue(authorities.contains("ROLE_MANAGER"));
     }
 }

+ 4 - 4
ldap/src/test/java/org/springframework/security/ldap/populator/UserDetailsServiceLdapAuthoritiesPopulatorTests.java

@@ -1,9 +1,9 @@
 package org.springframework.security.ldap.populator;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.junit.Test;
 import org.springframework.ldap.core.DirContextAdapter;
@@ -27,9 +27,9 @@ public class UserDetailsServiceLdapAuthoritiesPopulatorTests {
         when(user.getAuthorities()).thenReturn(AuthorityUtils.createAuthorityList("ROLE_USER"));
 
         UserDetailsServiceLdapAuthoritiesPopulator populator = new UserDetailsServiceLdapAuthoritiesPopulator(uds);
-        List<GrantedAuthority> auths =  populator.getGrantedAuthorities(new DirContextAdapter(), "joe");
+        Collection<GrantedAuthority> auths =  populator.getGrantedAuthorities(new DirContextAdapter(), "joe");
 
         assertEquals(1, auths.size());
-        assertEquals("ROLE_USER", auths.get(0).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(auths).contains("ROLE_USER"));
     }
 }

+ 1 - 4
ldap/src/test/java/org/springframework/security/ldap/userdetails/LdapUserDetailsMapperTests.java

@@ -23,9 +23,6 @@ import junit.framework.TestCase;
 import org.springframework.ldap.core.DirContextAdapter;
 import org.springframework.ldap.core.DistinguishedName;
 import org.springframework.security.core.authority.AuthorityUtils;
-import org.springframework.security.ldap.userdetails.LdapUserDetails;
-import org.springframework.security.ldap.userdetails.LdapUserDetailsImpl;
-import org.springframework.security.ldap.userdetails.LdapUserDetailsMapper;
 
 /**
  * Tests {@link LdapUserDetailsMapper}.
@@ -69,7 +66,7 @@ public class LdapUserDetailsMapperTests extends TestCase {
         LdapUserDetailsImpl user = (LdapUserDetailsImpl) mapper.mapUserFromContext(ctx, "ani", AuthorityUtils.NO_AUTHORITIES);
 
         assertEquals(1, user.getAuthorities().size());
-        assertEquals("ROLE_X", user.getAuthorities().get(0).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(user.getAuthorities()).contains("ROLE_X"));
     }
 
     public void testPasswordAttributeIsMappedCorrectly() throws Exception {

+ 2 - 2
ldap/src/test/java/org/springframework/security/ldap/userdetails/LdapUserDetailsServiceTests.java

@@ -2,7 +2,7 @@ package org.springframework.security.ldap.userdetails;
 
 import static org.junit.Assert.*;
 
-import java.util.List;
+import java.util.Collection;
 import java.util.Set;
 
 import org.junit.Test;
@@ -58,7 +58,7 @@ public class LdapUserDetailsServiceTests {
     }
 
     class MockAuthoritiesPopulator implements LdapAuthoritiesPopulator {
-        public List<GrantedAuthority> getGrantedAuthorities(DirContextOperations userCtx, String username) {
+        public Collection<GrantedAuthority> getGrantedAuthorities(DirContextOperations userCtx, String username) {
             return AuthorityUtils.createAuthorityList("ROLE_FROM_POPULATOR");
         }
     }

+ 2 - 1
openid/src/main/java/org/springframework/security/openid/OpenIDAuthenticationToken.java

@@ -15,6 +15,7 @@
 package org.springframework.security.openid;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import org.springframework.security.authentication.AbstractAuthenticationToken;
@@ -55,7 +56,7 @@ public class OpenIDAuthenticationToken extends AbstractAuthenticationToken {
      * used by the <tt>OpenIDAuthenticationProvider</tt>.
      *
      */
-    public OpenIDAuthenticationToken(Object principal, List<GrantedAuthority> authorities,
+    public OpenIDAuthenticationToken(Object principal, Collection<GrantedAuthority> authorities,
             String identityUrl, List<OpenIDAttribute> attributes) {
         super(authorities);
         this.principal = principal;

+ 2 - 10
web/src/main/java/org/springframework/security/web/authentication/preauth/PreAuthenticatedAuthenticationToken.java

@@ -1,7 +1,6 @@
 package org.springframework.security.web.authentication.preauth;
 
-import java.util.Arrays;
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.authentication.AbstractAuthenticationToken;
 import org.springframework.security.core.GrantedAuthority;
@@ -39,13 +38,6 @@ public class PreAuthenticatedAuthenticationToken extends AbstractAuthenticationT
         this.credentials = aCredentials;
     }
 
-    /**
-     *
-     * @deprecated
-     */
-    public PreAuthenticatedAuthenticationToken(Object aPrincipal, Object aCredentials, GrantedAuthority[] anAuthorities) {
-        this(aPrincipal, aCredentials, Arrays.asList(anAuthorities));
-    }
 
     /**
      * Constructor used for an authentication response. The {@link
@@ -57,7 +49,7 @@ public class PreAuthenticatedAuthenticationToken extends AbstractAuthenticationT
      * @param anAuthorities
      *            The granted authorities
      */
-    public PreAuthenticatedAuthenticationToken(Object aPrincipal, Object aCredentials, List<GrantedAuthority> anAuthorities) {
+    public PreAuthenticatedAuthenticationToken(Object aPrincipal, Object aCredentials, Collection<GrantedAuthority> anAuthorities) {
         super(anAuthorities);
         this.principal = aPrincipal;
         this.credentials = aCredentials;

+ 2 - 2
web/src/main/java/org/springframework/security/web/authentication/switchuser/SwitchUserAuthorityChanger.java

@@ -1,6 +1,6 @@
 package org.springframework.security.web.authentication.switchuser;
 
-import java.util.List;
+import java.util.Collection;
 
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.GrantedAuthority;
@@ -28,5 +28,5 @@ public interface SwitchUserAuthorityChanger {
      *
      * @return the modified list of granted authorities.
      */
-    List<GrantedAuthority> modifyGrantedAuthorities(UserDetails targetUser, Authentication currentAuthentication, List<GrantedAuthority> authoritiesToBeGranted);
+    Collection<GrantedAuthority> modifyGrantedAuthorities(UserDetails targetUser, Authentication currentAuthentication, Collection<GrantedAuthority> authoritiesToBeGranted);
 }

+ 3 - 2
web/src/main/java/org/springframework/security/web/authentication/switchuser/SwitchUserProcessingFilter.java

@@ -17,6 +17,7 @@ package org.springframework.security.web.authentication.switchuser;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import javax.servlet.FilterChain;
@@ -290,7 +291,7 @@ public class SwitchUserProcessingFilter extends GenericFilterBean implements App
         GrantedAuthority switchAuthority = new SwitchUserGrantedAuthority(ROLE_PREVIOUS_ADMINISTRATOR, currentAuth);
 
         // get the original authorities
-        List<GrantedAuthority> orig = targetUser.getAuthorities();
+        Collection<GrantedAuthority> orig = targetUser.getAuthorities();
 
         // Allow subclasses to change the authorities to be granted
         if (switchUserAuthorityChanger != null) {
@@ -323,7 +324,7 @@ public class SwitchUserProcessingFilter extends GenericFilterBean implements App
         Authentication original = null;
 
         // iterate over granted authorities and find the 'switch user' authority
-        List<GrantedAuthority> authorities = current.getAuthorities();
+        Collection<GrantedAuthority> authorities = current.getAuthorities();
 
         for (GrantedAuthority auth : authorities) {
             // check for switch user type of authority

+ 2 - 2
web/src/main/java/org/springframework/security/web/servletapi/SecurityContextHolderAwareRequestWrapper.java

@@ -17,7 +17,7 @@ package org.springframework.security.web.servletapi;
 
 
 import java.security.Principal;
-import java.util.List;
+import java.util.Collection;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
@@ -128,7 +128,7 @@ public class SecurityContextHolderAwareRequestWrapper extends HttpServletRequest
             return false;
         }
 
-        List<GrantedAuthority> authorities = auth.getAuthorities();
+        Collection<GrantedAuthority> authorities = auth.getAuthorities();
 
         if (authorities == null) {
             return false;

+ 2 - 10
web/src/test/java/org/springframework/security/web/authentication/AnonymousProcessingFilterTests.java

@@ -33,6 +33,7 @@ import org.springframework.mock.web.MockHttpServletResponse;
 import org.springframework.security.authentication.TestingAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.AuthorityUtils;
 import org.springframework.security.core.authority.GrantedAuthorityImpl;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.userdetails.memory.UserAttribute;
@@ -45,15 +46,6 @@ import org.springframework.security.core.userdetails.memory.UserAttribute;
  * @version $Id$
  */
 public class AnonymousProcessingFilterTests extends TestCase {
-    //~ Constructors ===================================================================================================
-
-    public AnonymousProcessingFilterTests() {
-        super();
-    }
-
-    public AnonymousProcessingFilterTests(String arg0) {
-        super(arg0);
-    }
 
     //~ Methods ========================================================================================================
 
@@ -164,7 +156,7 @@ public class AnonymousProcessingFilterTests extends TestCase {
 
         Authentication auth = SecurityContextHolder.getContext().getAuthentication();
         assertEquals("anonymousUsername", auth.getPrincipal());
-        assertEquals(new GrantedAuthorityImpl("ROLE_ANONYMOUS"), auth.getAuthorities().get(0));
+        assertTrue(AuthorityUtils.authorityListToSet(auth.getAuthorities()).contains("ROLE_ANONYMOUS"));
         SecurityContextHolder.getContext().setAuthentication(null); // so anonymous fires again
 
         // Now test operation if we have removeAfterRequest = true

+ 2 - 1
web/src/test/java/org/springframework/security/web/authentication/preauth/PreAuthenticatedAuthenticationTokenTests.java

@@ -1,5 +1,6 @@
 package org.springframework.security.web.authentication.preauth;
 
+import java.util.Collection;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -47,7 +48,7 @@ public class PreAuthenticatedAuthenticationTokenTests extends TestCase {
         assertEquals(credentials, token.getCredentials());
         assertNull(token.getDetails());
         assertNotNull(token.getAuthorities());
-        List<GrantedAuthority> resultColl = token.getAuthorities();
+        Collection<GrantedAuthority> resultColl = token.getAuthorities();
         assertTrue("GrantedAuthority collections do not match; result: " + resultColl + ", expected: " + gas,
                 gas.containsAll(resultColl) && resultColl.containsAll(gas));
 

+ 3 - 2
web/src/test/java/org/springframework/security/web/authentication/switchuser/SwitchUserProcessingFilterTests.java

@@ -19,6 +19,7 @@ import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import javax.servlet.FilterChain;
@@ -368,7 +369,7 @@ public class SwitchUserProcessingFilterTests {
         SwitchUserProcessingFilter filter = new SwitchUserProcessingFilter();
         filter.setUserDetailsService(new MockUserDetailsService());
         filter.setSwitchUserAuthorityChanger(new SwitchUserAuthorityChanger() {
-            public List<GrantedAuthority> modifyGrantedAuthorities(UserDetails targetUser, Authentication currentAuthentication, List<GrantedAuthority> authoritiesToBeGranted) {
+            public Collection<GrantedAuthority> modifyGrantedAuthorities(UserDetails targetUser, Authentication currentAuthentication, Collection<GrantedAuthority> authoritiesToBeGranted) {
                 List <GrantedAuthority>auths = new ArrayList<GrantedAuthority>();
                 auths.add(new GrantedAuthorityImpl("ROLE_NEW"));
                 return auths;
@@ -378,7 +379,7 @@ public class SwitchUserProcessingFilterTests {
         Authentication result = filter.attemptSwitchUser(request);
         assertTrue(result != null);
         assertEquals(2, result.getAuthorities().size());
-        assertEquals("ROLE_NEW", result.getAuthorities().get(0).getAuthority());
+        assertTrue(AuthorityUtils.authorityListToSet(result.getAuthorities()).contains("ROLE_NEW"));
     }