Explorar o código

SEC-134 fix. Authorities array is now copied on access. Also refactored token classes to move authorities to the base class.

Luke Taylor %!s(int64=19) %!d(string=hai) anos
pai
achega
fe88d6ec17
Modificáronse 19 ficheiros con 134 adicións e 139 borrados
  1. 5 0
      core/src/main/java/org/acegisecurity/Authentication.java
  2. 6 10
      core/src/main/java/org/acegisecurity/adapters/AbstractAdapterAuthenticationToken.java
  3. 57 4
      core/src/main/java/org/acegisecurity/providers/AbstractAuthenticationToken.java
  4. 1 10
      core/src/main/java/org/acegisecurity/providers/TestingAuthenticationToken.java
  5. 2 6
      core/src/main/java/org/acegisecurity/providers/UsernamePasswordAuthenticationToken.java
  6. 3 16
      core/src/main/java/org/acegisecurity/providers/anonymous/AnonymousAuthenticationToken.java
  7. 5 22
      core/src/main/java/org/acegisecurity/providers/cas/CasAuthenticationToken.java
  8. 2 10
      core/src/main/java/org/acegisecurity/providers/rememberme/RememberMeAuthenticationToken.java
  9. 6 8
      core/src/main/java/org/acegisecurity/providers/x509/X509AuthenticationToken.java
  10. 2 12
      core/src/main/java/org/acegisecurity/runas/RunAsUserToken.java
  11. 6 4
      core/src/test/java/org/acegisecurity/MockRunAsAuthenticationToken.java
  12. 3 1
      core/src/test/java/org/acegisecurity/adapters/AuthByAdapterTests.java
  13. 2 7
      core/src/test/java/org/acegisecurity/providers/AbstractAuthenticationTokenTests.java
  14. 7 4
      core/src/test/java/org/acegisecurity/providers/TestingAuthenticationTokenTests.java
  15. 7 4
      core/src/test/java/org/acegisecurity/providers/anonymous/AnonymousAuthenticationTokenTests.java
  16. 6 4
      core/src/test/java/org/acegisecurity/providers/cas/CasAuthenticationTokenTests.java
  17. 6 4
      core/src/test/java/org/acegisecurity/providers/rememberme/RememberMeAuthenticationTokenTests.java
  18. 7 4
      core/src/test/java/org/acegisecurity/runas/RunAsUserTokenTests.java
  19. 1 9
      sandbox/src/main/java/org/acegisecurity/providers/smb/NtlmAuthenticationToken.java

+ 5 - 0
core/src/main/java/org/acegisecurity/Authentication.java

@@ -96,6 +96,11 @@ public interface Authentication extends Principal, Serializable {
      * that the principal has been granted. Note that classes should not rely
      * on this value as being valid unless it has been set by a trusted
      * <code>AuthenticationManager</code>.
+     * <p>
+     * Implementations should ensure that modifications to the returned array
+     * do not affect the state of the Authentication object (e.g. by returning an
+     * array copy).
+     * </p>
      *
      * @return the authorities granted to the principal, or <code>null</code>
      *         if authentication has not been completed

+ 6 - 10
core/src/main/java/org/acegisecurity/adapters/AbstractAdapterAuthenticationToken.java

@@ -29,13 +29,12 @@ public abstract class AbstractAdapterAuthenticationToken
     extends AbstractAuthenticationToken implements AuthByAdapter {
     //~ Instance fields ========================================================
 
-    private GrantedAuthority[] authorities;
     private int keyHash;
 
     //~ Constructors ===========================================================
 
     protected AbstractAdapterAuthenticationToken() {
-        super();
+        super(null);
     }
 
     /**
@@ -48,9 +47,8 @@ public abstract class AbstractAdapterAuthenticationToken
      */
     protected AbstractAdapterAuthenticationToken(String key,
         GrantedAuthority[] authorities) {
-        super();
+        super(authorities);
         this.keyHash = key.hashCode();
-        this.authorities = authorities;
     }
 
     //~ Methods ================================================================
@@ -73,10 +71,6 @@ public abstract class AbstractAdapterAuthenticationToken
         return true;
     }
 
-    public GrantedAuthority[] getAuthorities() {
-        return authorities;
-    }
-
     public int getKeyHash() {
         return this.keyHash;
     }
@@ -97,8 +91,10 @@ public abstract class AbstractAdapterAuthenticationToken
      *         <code>false</code> otherwise
      */
     public boolean isUserInRole(String role) {
-        for (int i = 0; i < this.authorities.length; i++) {
-            if (role.equals(this.authorities[i].getAuthority())) {
+        GrantedAuthority[] authorities = super.getAuthorities();
+
+        for (int i = 0; i < authorities.length; i++) {
+            if (role.equals(authorities[i].getAuthority())) {
                 return true;
             }
         }

+ 57 - 4
core/src/main/java/org/acegisecurity/providers/AbstractAuthenticationToken.java

@@ -16,17 +16,59 @@
 package org.acegisecurity.providers;
 
 import org.acegisecurity.Authentication;
+import org.acegisecurity.GrantedAuthority;
 
 import org.acegisecurity.userdetails.UserDetails;
 
-
 /**
- * Provides a <code>String</code> representation of the Authentication token.
+ * Base class for Authentication objects.
+ * <p>
+ * Implementations which use this class should be immutable.
+ * </p>
  *
  * @author Ben Alex
+ * @author Luke Taylor
  * @version $Id$
  */
 public abstract class AbstractAuthenticationToken implements Authentication {
+
+    //~ Instance fields
+    private GrantedAuthority[] authorities;
+
+    //~ Constructors ===========================================================
+
+    /**
+     * Retained for compatibility with subclasses written before the
+     * <tt>AbstractAuthenticationToken(GrantedAuthority[])</tt> constructor
+     * was introduced.
+     *
+     * @deprecated in favour of the constructor which takes a GrantedAuthority[]
+     * argument. 
+     */
+    public AbstractAuthenticationToken() {
+
+    }
+
+    /**
+     * Creates a token with the supplied array of authorities.
+     *
+     * @param authorities the list of <tt>GrantedAuthority</tt>s for the principal
+     *                    represented by this authentication object. A null value
+     *                    indicates that no authorities have been granted.
+     */
+    public AbstractAuthenticationToken(GrantedAuthority[] authorities) {
+        if(authorities != null) {
+            for (int i = 0; i < authorities.length; i++) {
+                if(authorities[i] == null) {
+                    throw new IllegalArgumentException("Granted authority element " + i
+                        + " is null - GrantedAuthority[] cannot contain any null elements");
+                }
+            }
+        }
+
+        this.authorities = authorities;
+    }
+
     //~ Methods ================================================================
 
     public boolean equals(Object obj) {
@@ -53,8 +95,8 @@ public abstract class AbstractAuthenticationToken implements Authentication {
             }
 
             return (this.getPrincipal().equals(test.getPrincipal())
-            && this.getCredentials().equals(test.getCredentials())
-            && (this.isAuthenticated() == test.isAuthenticated()));
+                && this.getCredentials().equals(test.getCredentials())
+                && (this.isAuthenticated() == test.isAuthenticated()));
         }
 
         return false;
@@ -78,6 +120,17 @@ public abstract class AbstractAuthenticationToken implements Authentication {
         return this.getPrincipal().toString();
     }
 
+    public GrantedAuthority[] getAuthorities() {
+        if(authorities == null) {
+            return null;
+        }
+
+        GrantedAuthority[] copy = new GrantedAuthority[authorities.length];
+        System.arraycopy(authorities, 0, copy, 0, authorities.length);
+
+        return copy;
+    }
+
     public int hashCode() {
         int code = 2305;
 

+ 1 - 10
core/src/main/java/org/acegisecurity/providers/TestingAuthenticationToken.java

@@ -35,20 +35,15 @@ public class TestingAuthenticationToken extends AbstractAuthenticationToken {
 
     private Object credentials;
     private Object principal;
-    private GrantedAuthority[] authorities;
     private boolean authenticated = false;
 
     //~ Constructors ===========================================================
 
     public TestingAuthenticationToken(Object principal, Object credentials,
         GrantedAuthority[] authorities) {
+        super(authorities);
         this.principal = principal;
         this.credentials = credentials;
-        this.authorities = authorities;
-    }
-
-    protected TestingAuthenticationToken() {
-        throw new IllegalArgumentException("Cannot use default constructor");
     }
 
     //~ Methods ================================================================
@@ -61,10 +56,6 @@ public class TestingAuthenticationToken extends AbstractAuthenticationToken {
         return this.authenticated;
     }
 
-    public GrantedAuthority[] getAuthorities() {
-        return this.authorities;
-    }
-
     public Object getCredentials() {
         return this.credentials;
     }

+ 2 - 6
core/src/main/java/org/acegisecurity/providers/UsernamePasswordAuthenticationToken.java

@@ -39,7 +39,6 @@ public class UsernamePasswordAuthenticationToken
     private Object credentials;
     private Object details = null;
     private Object principal;
-    private GrantedAuthority[] authorities;
     private boolean authenticated;
 
     //~ Constructors ===========================================================
@@ -54,6 +53,7 @@ public class UsernamePasswordAuthenticationToken
      */
     public UsernamePasswordAuthenticationToken(Object principal,
         Object credentials) {
+        super(null);
         this.principal = principal;
         this.credentials = credentials;
         this.authenticated = false;
@@ -72,9 +72,9 @@ public class UsernamePasswordAuthenticationToken
      */
     public UsernamePasswordAuthenticationToken(Object principal,
         Object credentials, GrantedAuthority[] authorities) {
+        super(authorities);
         this.principal = principal;
         this.credentials = credentials;
-        this.authorities = authorities;
         this.authenticated = true;
     }
 
@@ -94,10 +94,6 @@ public class UsernamePasswordAuthenticationToken
         return this.authenticated;
     }
 
-    public GrantedAuthority[] getAuthorities() {
-        return this.authorities;
-    }
-
     public Object getCredentials() {
         return this.credentials;
     }

+ 3 - 16
core/src/main/java/org/acegisecurity/providers/anonymous/AnonymousAuthenticationToken.java

@@ -34,7 +34,6 @@ public class AnonymousAuthenticationToken extends AbstractAuthenticationToken
     //~ Instance fields ========================================================
 
     private Object principal;
-    private GrantedAuthority[] authorities;
     private boolean authenticated;
     private int keyHash;
 
@@ -51,6 +50,9 @@ public class AnonymousAuthenticationToken extends AbstractAuthenticationToken
      */
     public AnonymousAuthenticationToken(String key, Object principal,
         GrantedAuthority[] authorities) {
+
+        super(authorities);
+
         if ((key == null) || ("".equals(key)) || (principal == null)
             || "".equals(principal) || (authorities == null)
             || (authorities.length == 0)) {
@@ -58,22 +60,11 @@ public class AnonymousAuthenticationToken extends AbstractAuthenticationToken
                 "Cannot pass null or empty values to constructor");
         }
 
-        for (int i = 0; i < authorities.length; i++) {
-            Assert.notNull(authorities[i],
-                "Granted authority element " + i
-                + " is null - GrantedAuthority[] cannot contain any null elements");
-        }
-
         this.keyHash = key.hashCode();
         this.principal = principal;
-        this.authorities = authorities;
 		this.authenticated = true;
     }
 
-    protected AnonymousAuthenticationToken() {
-        throw new IllegalArgumentException("Cannot use default constructor");
-    }
-
     //~ Methods ================================================================
 
     public void setAuthenticated(boolean isAuthenticated) {
@@ -84,10 +75,6 @@ public class AnonymousAuthenticationToken extends AbstractAuthenticationToken
         return this.authenticated;
     }
 
-    public GrantedAuthority[] getAuthorities() {
-        return this.authorities;
-    }
-
     /**
      * Always returns an empty <code>String</code>
      *

+ 5 - 22
core/src/main/java/org/acegisecurity/providers/cas/CasAuthenticationToken.java

@@ -43,7 +43,6 @@ public class CasAuthenticationToken extends AbstractAuthenticationToken
     private Object principal;
     private String proxyGrantingTicketIou;
     private UserDetails userDetails;
-    private GrantedAuthority[] authorities;
     private boolean authenticated;
     private int keyHash;
 
@@ -72,6 +71,7 @@ public class CasAuthenticationToken extends AbstractAuthenticationToken
     public CasAuthenticationToken(String key, Object principal,
         Object credentials, GrantedAuthority[] authorities,
         UserDetails userDetails, List proxyList, String proxyGrantingTicketIou) {
+        super(authorities);
         if ((key == null) || ("".equals(key)) || (principal == null)
             || "".equals(principal) || (credentials == null)
             || "".equals(credentials) || (authorities == null)
@@ -81,26 +81,15 @@ public class CasAuthenticationToken extends AbstractAuthenticationToken
                 "Cannot pass null or empty values to constructor");
         }
 
-        for (int i = 0; i < authorities.length; i++) {
-            Assert.notNull(authorities[i],
-                "Granted authority element " + i
-                + " is null - GrantedAuthority[] cannot contain any null elements");
-        }
-
         this.keyHash = key.hashCode();
         this.principal = principal;
         this.credentials = credentials;
-        this.authorities = authorities;
         this.userDetails = userDetails;
         this.proxyList = proxyList;
         this.proxyGrantingTicketIou = proxyGrantingTicketIou;
         this.authenticated = true;
     }
 
-    protected CasAuthenticationToken() {
-        throw new IllegalArgumentException("Cannot use default constructor");
-    }
-
     //~ Methods ================================================================
 
     public boolean equals(Object obj) {
@@ -132,10 +121,6 @@ public class CasAuthenticationToken extends AbstractAuthenticationToken
         return false;
     }
 
-    public GrantedAuthority[] getAuthorities() {
-        return this.authorities;
-    }
-
     public Object getCredentials() {
         return this.credentials;
     }
@@ -177,12 +162,10 @@ public class CasAuthenticationToken extends AbstractAuthenticationToken
     public String toString() {
         StringBuffer sb = new StringBuffer();
         sb.append(super.toString());
-        sb.append("; Credentials (Service/Proxy Ticket): ");
-        sb.append(this.credentials);
-        sb.append("; Proxy-Granting Ticket IOU: ");
-        sb.append(this.proxyGrantingTicketIou);
-        sb.append("; Proxy List: ");
-        sb.append(this.proxyList.toString());
+        sb.append("; Credentials (Service/Proxy Ticket): ").append(this.credentials);
+        sb.append("; Proxy-Granting Ticket IOU: ").append(this.proxyGrantingTicketIou);
+        sb.append("; Proxy List: ").append(this.proxyList);
+
 
         return (sb.toString());
     }

+ 2 - 10
core/src/main/java/org/acegisecurity/providers/rememberme/RememberMeAuthenticationToken.java

@@ -40,7 +40,6 @@ public class RememberMeAuthenticationToken extends AbstractAuthenticationToken
     //~ Instance fields ========================================================
 
     private Object principal;
-    private GrantedAuthority[] authorities;
     private int keyHash;
 	private boolean authenticated;
 
@@ -57,6 +56,8 @@ public class RememberMeAuthenticationToken extends AbstractAuthenticationToken
      */
     public RememberMeAuthenticationToken(String key, Object principal,
         GrantedAuthority[] authorities) {
+        super(authorities);
+
         if ((key == null) || ("".equals(key)) || (principal == null)
             || "".equals(principal) || (authorities == null)
             || (authorities.length == 0)) {
@@ -72,14 +73,9 @@ public class RememberMeAuthenticationToken extends AbstractAuthenticationToken
 
         this.keyHash = key.hashCode();
         this.principal = principal;
-        this.authorities = authorities;
 		this.authenticated = true;
     }
 
-    protected RememberMeAuthenticationToken() {
-        throw new IllegalArgumentException("Cannot use default constructor");
-    }
-
     //~ Methods ================================================================
 
     public void setAuthenticated(boolean isAuthenticated) {
@@ -90,10 +86,6 @@ public class RememberMeAuthenticationToken extends AbstractAuthenticationToken
         return this.authenticated;
     }
 
-    public GrantedAuthority[] getAuthorities() {
-        return this.authorities;
-    }
-
     /**
      * Always returns an empty <code>String</code>
      *

+ 6 - 8
core/src/main/java/org/acegisecurity/providers/x509/X509AuthenticationToken.java

@@ -31,7 +31,6 @@ public class X509AuthenticationToken extends AbstractAuthenticationToken {
 
     private X509Certificate credentials;
     private Object principal;
-    private GrantedAuthority[] authorities;
     private boolean authenticated = false;
     private Object details = null;
 
@@ -39,13 +38,16 @@ public class X509AuthenticationToken extends AbstractAuthenticationToken {
 
     /** Used for an authentication request */
     public X509AuthenticationToken(X509Certificate credentials) {
+        super(null);
         this.credentials = credentials;
     }
 
-    public X509AuthenticationToken(Object principal, X509Certificate credentials, GrantedAuthority[] authorities) {
+    public X509AuthenticationToken(Object principal,
+                                   X509Certificate credentials,
+                                   GrantedAuthority[] authorities) {
+        super(authorities);
+        this.principal = principal;        
         this.credentials = credentials;
-        this.principal = principal;
-        this.authorities = authorities;
     }
 
     //~ Methods ================================================================
@@ -67,10 +69,6 @@ public class X509AuthenticationToken extends AbstractAuthenticationToken {
         return authenticated;
     }
 
-    public GrantedAuthority[] getAuthorities() {
-        return authorities;
-    }
-
     public Object getCredentials() {
         return credentials;
     }

+ 2 - 12
core/src/main/java/org/acegisecurity/runas/RunAsUserToken.java

@@ -32,7 +32,6 @@ public class RunAsUserToken extends AbstractAuthenticationToken {
     private Class originalAuthentication;
     private Object credentials;
     private Object principal;
-    private GrantedAuthority[] authorities;
     private int keyHash;
 	private boolean authenticated;
 
@@ -40,19 +39,14 @@ public class RunAsUserToken extends AbstractAuthenticationToken {
 
     public RunAsUserToken(String key, Object principal, Object credentials,
         GrantedAuthority[] authorities, Class originalAuthentication) {
-        super();
+        super(authorities);
         this.keyHash = key.hashCode();
-        this.authorities = authorities;
         this.principal = principal;
         this.credentials = credentials;
         this.originalAuthentication = originalAuthentication;
 		this.authenticated = true;
     }
 
-    protected RunAsUserToken() {
-        throw new IllegalArgumentException("Cannot use default constructor");
-    }
-
     //~ Methods ================================================================
 
     public void setAuthenticated(boolean isAuthenticated) {
@@ -63,10 +57,6 @@ public class RunAsUserToken extends AbstractAuthenticationToken {
         return this.authenticated;
     }
 
-    public GrantedAuthority[] getAuthorities() {
-        return this.authorities;
-    }
-
     public Object getCredentials() {
         return this.credentials;
     }
@@ -85,7 +75,7 @@ public class RunAsUserToken extends AbstractAuthenticationToken {
 
     public String toString() {
         StringBuffer sb = new StringBuffer(super.toString());
-        sb.append("; Original Class: " + this.originalAuthentication.getName());
+        sb.append("; Original Class: ").append(this.originalAuthentication.getName());
 
         return sb.toString();
     }

+ 6 - 4
core/src/test/java/org/acegisecurity/MockRunAsAuthenticationToken.java

@@ -30,6 +30,12 @@ public class MockRunAsAuthenticationToken extends AbstractAuthenticationToken {
 
     private boolean authenticated = false;
 
+    //~ Constructors ===========================================================
+
+    public MockRunAsAuthenticationToken() {
+        super(null);
+    }
+
     //~ Methods ================================================================
 
     public void setAuthenticated(boolean isAuthenticated) {
@@ -40,10 +46,6 @@ public class MockRunAsAuthenticationToken extends AbstractAuthenticationToken {
         return authenticated;
     }
 
-    public GrantedAuthority[] getAuthorities() {
-        return null;
-    }
-
     public Object getCredentials() {
         return null;
     }

+ 3 - 1
core/src/test/java/org/acegisecurity/adapters/AuthByAdapterTests.java

@@ -24,6 +24,8 @@ import org.acegisecurity.GrantedAuthorityImpl;
 
 import org.acegisecurity.providers.UsernamePasswordAuthenticationToken;
 
+import java.util.Arrays;
+
 /**
  * Tests {@link AuthByAdapterProvider}
  *
@@ -67,7 +69,7 @@ public class AuthByAdapterTests extends TestCase {
 
         assertEquals(token.getCredentials(), response.getCredentials());
         assertEquals(token.getPrincipal(), response.getPrincipal());
-        assertEquals(token.getAuthorities(), response.getAuthorities());
+        assertTrue(Arrays.equals(token.getAuthorities(), response.getAuthorities()));
 
         if (!response.getClass().equals(token.getClass())) {
             fail("Should have returned same type of object it was given");

+ 2 - 7
core/src/test/java/org/acegisecurity/providers/AbstractAuthenticationTokenTests.java

@@ -148,22 +148,17 @@ public class AbstractAuthenticationTokenTests extends TestCase {
     private class MockAuthenticationImpl extends AbstractAuthenticationToken {
         private Object credentials;
         private Object principal;
-        private GrantedAuthority[] authorities;
         private boolean authenticated = false;
 
         public MockAuthenticationImpl(Object principal, Object credentials,
             GrantedAuthority[] authorities) {
+            super(authorities);
             this.principal = principal;
             this.credentials = credentials;
-            this.authorities = authorities;
         }
 
         private MockAuthenticationImpl() {
-            super();
-        }
-
-        public GrantedAuthority[] getAuthorities() {
-            return this.authorities;
+            super(null);
         }
 
         public Object getCredentials() {

+ 7 - 4
core/src/test/java/org/acegisecurity/providers/TestingAuthenticationTokenTests.java

@@ -19,6 +19,7 @@ import junit.framework.TestCase;
 
 import org.acegisecurity.GrantedAuthority;
 import org.acegisecurity.GrantedAuthorityImpl;
+import org.acegisecurity.providers.rememberme.RememberMeAuthenticationToken;
 
 
 /**
@@ -67,11 +68,13 @@ public class TestingAuthenticationTokenTests extends TestCase {
         assertEquals("ROLE_TWO", token.getAuthorities()[1].getAuthority());
     }
 
-    public void testNoArgConstructor() {
+    public void testNoArgConstructorDoesntExist() {
+        Class clazz = TestingAuthenticationToken.class;
+
         try {
-            new TestingAuthenticationToken();
-            fail("Should have thrown IllegalArgumentException");
-        } catch (IllegalArgumentException expected) {
+            clazz.getDeclaredConstructor((Class[])null);
+            fail("Should have thrown NoSuchMethodException");
+        } catch (NoSuchMethodException expected) {
             assertTrue(true);
         }
     }

+ 7 - 4
core/src/test/java/org/acegisecurity/providers/anonymous/AnonymousAuthenticationTokenTests.java

@@ -20,6 +20,7 @@ import junit.framework.TestCase;
 import org.acegisecurity.GrantedAuthority;
 import org.acegisecurity.GrantedAuthorityImpl;
 import org.acegisecurity.providers.UsernamePasswordAuthenticationToken;
+import org.acegisecurity.providers.rememberme.RememberMeAuthenticationToken;
 
 import java.util.List;
 import java.util.Vector;
@@ -126,11 +127,13 @@ public class AnonymousAuthenticationTokenTests extends TestCase {
         assertTrue(token.isAuthenticated());
     }
 
-    public void testNoArgConstructor() {
+    public void testNoArgConstructorDoesntExist() {
+        Class clazz = AnonymousAuthenticationToken.class;
+
         try {
-            new AnonymousAuthenticationToken();
-            fail("Should have thrown IllegalArgumentException");
-        } catch (IllegalArgumentException expected) {
+            clazz.getDeclaredConstructor((Class[])null);
+            fail("Should have thrown NoSuchMethodException");
+        } catch (NoSuchMethodException expected) {
             assertTrue(true);
         }
     }

+ 6 - 4
core/src/test/java/org/acegisecurity/providers/cas/CasAuthenticationTokenTests.java

@@ -178,11 +178,13 @@ public class CasAuthenticationTokenTests extends TestCase {
             token.getUserDetails().getUsername());
     }
 
-    public void testNoArgConstructor() {
+    public void testNoArgConstructorDoesntExist() {
+        Class clazz = CasAuthenticationToken.class;
+
         try {
-            new CasAuthenticationToken();
-            fail("Should have thrown IllegalArgumentException");
-        } catch (IllegalArgumentException expected) {
+            clazz.getDeclaredConstructor((Class[])null);
+            fail("Should have thrown NoSuchMethodException");
+        } catch (NoSuchMethodException expected) {
             assertTrue(true);
         }
     }

+ 6 - 4
core/src/test/java/org/acegisecurity/providers/rememberme/RememberMeAuthenticationTokenTests.java

@@ -126,11 +126,13 @@ public class RememberMeAuthenticationTokenTests extends TestCase {
         assertTrue(token.isAuthenticated());
     }
 
-    public void testNoArgConstructor() {
+    public void testNoArgConstructorDoesntExist() {
+        Class clazz = RememberMeAuthenticationToken.class;
+
         try {
-            new RememberMeAuthenticationToken();
-            fail("Should have thrown IllegalArgumentException");
-        } catch (IllegalArgumentException expected) {
+            clazz.getDeclaredConstructor((Class[])null);
+            fail("Should have thrown NoSuchMethodException");
+        } catch (NoSuchMethodException expected) {
             assertTrue(true);
         }
     }

+ 7 - 4
core/src/test/java/org/acegisecurity/runas/RunAsUserTokenTests.java

@@ -71,11 +71,14 @@ public class RunAsUserTokenTests extends TestCase {
             token.getOriginalAuthentication());
     }
 
-    public void testNoArgsConstructor() {
+
+    public void testNoArgConstructorDoesntExist() {
+        Class clazz = RunAsUserToken.class;
+
         try {
-            new RunAsUserToken();
-            fail("Should have thrown IllegalArgumentException");
-        } catch (IllegalArgumentException expected) {
+            clazz.getDeclaredConstructor((Class[])null);
+            fail("Should have thrown NoSuchMethodException");
+        } catch (NoSuchMethodException expected) {
             assertTrue(true);
         }
     }

+ 1 - 9
sandbox/src/main/java/org/acegisecurity/providers/smb/NtlmAuthenticationToken.java

@@ -38,7 +38,6 @@ public class NtlmAuthenticationToken extends AbstractAuthenticationToken {
 
     private NtlmPasswordAuthentication ntlmPasswordAuthentication;
     private transient UniAddress domainController;
-    private GrantedAuthority[] authorities;
     private boolean authenticated;
 
     //~ Constructors ===========================================================
@@ -46,6 +45,7 @@ public class NtlmAuthenticationToken extends AbstractAuthenticationToken {
     public NtlmAuthenticationToken(
         NtlmPasswordAuthentication ntlmPasswordAuthentication,
         UniAddress domainController) {
+        super(null);
         this.ntlmPasswordAuthentication = ntlmPasswordAuthentication;
         this.domainController = domainController;
     }
@@ -60,14 +60,6 @@ public class NtlmAuthenticationToken extends AbstractAuthenticationToken {
         return authenticated;
     }
 
-    public void setAuthorities(GrantedAuthority[] authorities) {
-        this.authorities = authorities;
-    }
-
-    public GrantedAuthority[] getAuthorities() {
-        return authorities;
-    }
-
     public Object getCredentials() {
         return ntlmPasswordAuthentication.getPassword();
     }