1
0
mirror of synced 2026-08-05 17:57:15 +00:00

SEC-1022: Remove use of static methods/initializers in Acl Permissions. Converted PermissionFactory to a strategy which is used to convert integers and names to Permission instances.

This commit is contained in:
Luke Taylor
2009-09-16 12:45:53 +00:00
parent 731402e9f5
commit 3f70d79df5
9 changed files with 119 additions and 117 deletions
@@ -7,8 +7,9 @@ import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.acls.domain.BasePermission;
import org.springframework.security.acls.domain.DefaultPermissionFactory;
import org.springframework.security.acls.domain.ObjectIdentityRetrievalStrategyImpl;
import org.springframework.security.acls.domain.PermissionFactory;
import org.springframework.security.acls.domain.SidRetrievalStrategyImpl;
import org.springframework.security.acls.model.Acl;
import org.springframework.security.acls.model.AclService;
@@ -38,6 +39,7 @@ public class AclPermissionEvaluator implements PermissionEvaluator {
private ObjectIdentityRetrievalStrategy objectIdentityRetrievalStrategy = new ObjectIdentityRetrievalStrategyImpl();
private ObjectIdentityGenerator objectIdentityGenerator = new ObjectIdentityRetrievalStrategyImpl();
private SidRetrievalStrategy sidRetrievalStrategy = new SidRetrievalStrategyImpl();
private PermissionFactory permissionFactory = new DefaultPermissionFactory();
public AclPermissionEvaluator(AclService aclService) {
this.aclService = aclService;
@@ -95,10 +97,9 @@ public class AclPermissionEvaluator implements PermissionEvaluator {
}
// TODO: Add permission resolver/PermissionFactory rewrite
List<Permission> resolvePermission(Object permission) {
if (permission instanceof Integer) {
return Arrays.asList(BasePermission.buildFromMask(((Integer)permission).intValue()));
return Arrays.asList(permissionFactory.buildFromMask(((Integer)permission).intValue()));
}
if (permission instanceof Permission) {
@@ -114,9 +115,9 @@ public class AclPermissionEvaluator implements PermissionEvaluator {
Permission p = null;
try {
p = BasePermission.buildFromName(permString);
p = permissionFactory.buildFromName(permString);
} catch(IllegalArgumentException notfound) {
p = BasePermission.buildFromName(permString.toUpperCase());
p = permissionFactory.buildFromName(permString.toUpperCase());
}
if (p != null) {
@@ -37,14 +37,6 @@ public class BasePermission extends AbstractPermission {
protected static DefaultPermissionFactory defaultPermissionFactory = new DefaultPermissionFactory();
/**
* Registers the public static permissions defined on this class. This is mandatory so
* that the static methods will operate correctly.
*/
static {
registerPermissionsFor(BasePermission.class);
}
protected BasePermission(int mask) {
super(mask);
}
@@ -53,24 +45,20 @@ public class BasePermission extends AbstractPermission {
super(mask, code);
}
protected final static void registerPermissionsFor(Class<? extends Permission> subClass) {
defaultPermissionFactory.registerPublicPermissions(subClass);
}
public final static Permission buildFromMask(int mask) {
return defaultPermissionFactory.buildFromMask(mask);
}
public final static Permission[] buildFromMask(int[] masks) {
return defaultPermissionFactory.buildFromMask(masks);
}
public final static Permission buildFromName(String name) {
return defaultPermissionFactory.buildFromName(name);
}
public final static Permission[] buildFromName(String[] names) {
return defaultPermissionFactory.buildFromName(names);
}
// public final static Permission buildFromMask(int mask) {
// return defaultPermissionFactory.buildFromMask(mask);
// }
//
// public final static Permission[] buildFromMask(int[] masks) {
// return defaultPermissionFactory.buildFromMask(masks);
// }
//
// public final static Permission buildFromName(String name) {
// return defaultPermissionFactory.buildFromName(name);
// }
//
// public final static Permission[] buildFromName(String[] names) {
// return defaultPermissionFactory.buildFromName(names);
// }
}
@@ -1,7 +1,10 @@
package org.springframework.security.acls.domain;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.security.acls.jdbc.LookupStrategy;
@@ -23,6 +26,10 @@ public class DefaultPermissionFactory implements PermissionFactory {
private final Map<Integer, Permission> registeredPermissionsByInteger = new HashMap<Integer, Permission>();
private final Map<String, Permission> registeredPermissionsByName = new HashMap<String, Permission>();
public DefaultPermissionFactory() {
registerPublicPermissions(BasePermission.class);
}
/**
* Permit registration of a {@link DefaultPermissionFactory} class. The class must provide
* public static fields of type {@link Permission} to represent the possible permissions.
@@ -106,15 +113,15 @@ public class DefaultPermissionFactory implements PermissionFactory {
return (Permission) registeredPermissionsByName.get(name);
}
public Permission[] buildFromName(String[] names) {
if ((names == null) || (names.length == 0)) {
return new Permission[0];
public List<Permission> buildFromNames(List<String> names) {
if ((names == null) || (names.size() == 0)) {
return Collections.emptyList();
}
Permission[] permissions = new Permission[names.length];
List<Permission> permissions = new ArrayList<Permission>(names.size());
for (int i = 0; i < names.length; i++) {
permissions[i] = buildFromName(names[i]);
for (String name : names) {
permissions.add(buildFromName(name));
}
return permissions;
@@ -1,13 +1,15 @@
package org.springframework.security.acls.domain;
import java.util.List;
import org.springframework.security.acls.model.Permission;
/**
* Provides a simple mechanism to retrieve {@link Permission} instances from integer masks.
*
*
* @author Ben Alex
* @since 2.0.3
*
*
*/
public interface PermissionFactory {
@@ -19,6 +21,11 @@ public interface PermissionFactory {
*
* @return a Permission representing the requested object
*/
public abstract Permission buildFromMask(int mask);
Permission buildFromMask(int mask);
}
Permission buildFromName(String name);
List<Permission> buildFromNames(List<String> names);
}
@@ -37,9 +37,10 @@ import org.springframework.security.acls.domain.AccessControlEntryImpl;
import org.springframework.security.acls.domain.AclAuthorizationStrategy;
import org.springframework.security.acls.domain.AclImpl;
import org.springframework.security.acls.domain.AuditLogger;
import org.springframework.security.acls.domain.BasePermission;
import org.springframework.security.acls.domain.DefaultPermissionFactory;
import org.springframework.security.acls.domain.GrantedAuthoritySid;
import org.springframework.security.acls.domain.ObjectIdentityImpl;
import org.springframework.security.acls.domain.PermissionFactory;
import org.springframework.security.acls.domain.PrincipalSid;
import org.springframework.security.acls.model.AccessControlEntry;
import org.springframework.security.acls.model.Acl;
@@ -71,6 +72,7 @@ public final class BasicLookupStrategy implements LookupStrategy {
//~ Instance fields ================================================================================================
private AclAuthorizationStrategy aclAuthorizationStrategy;
private PermissionFactory permissionFactory = new DefaultPermissionFactory();
private AclCache aclCache;
private AuditLogger auditLogger;
private JdbcTemplate jdbcTemplate;
@@ -225,11 +227,6 @@ public final class BasicLookupStrategy implements LookupStrategy {
}
}
protected Permission convertMaskIntoPermission(int mask) {
return BasePermission.buildFromMask(mask);
}
/**
* Locates the primary key IDs specified in "findNow", adding AclImpl instances with StubAclParents to the
* "acls" Map.
@@ -519,7 +516,7 @@ public final class BasicLookupStrategy implements LookupStrategy {
}
int mask = rs.getInt("mask");
Permission permission = convertMaskIntoPermission(mask);
Permission permission = permissionFactory.buildFromMask(mask);
boolean granting = rs.getBoolean("granting");
boolean auditSuccess = rs.getBoolean("audit_success");
boolean auditFailure = rs.getBoolean("audit_failure");
@@ -16,6 +16,7 @@ package org.springframework.security.acls.domain;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.springframework.security.acls.model.Permission;
@@ -24,13 +25,20 @@ import org.springframework.security.acls.model.Permission;
* Tests classes associated with Permission.
*
* @author Ben Alex
* @version $Id${date}
* @version $Id$
*/
public class PermissionTests {
private DefaultPermissionFactory permissionFactory;
@Before
public void createPermissionfactory() {
permissionFactory = new DefaultPermissionFactory();
}
@Test
public void basePermissionTest() {
Permission p = BasePermission.buildFromName("WRITE");
Permission p = permissionFactory.buildFromName("WRITE");
assertNotNull(p);
}
@@ -47,14 +55,16 @@ public class PermissionTests {
@Test
public void fromInteger() {
Permission permission = BasePermission.buildFromMask(7);
Permission permission = permissionFactory.buildFromMask(7);
System.out.println("7 = " + permission.toString());
permission = BasePermission.buildFromMask(4);
permission = permissionFactory.buildFromMask(4);
System.out.println("4 = " + permission.toString());
}
@Test
public void stringConversion() {
permissionFactory.registerPublicPermissions(SpecialPermission.class);
System.out.println("R = " + BasePermission.READ.toString());
assertEquals("BasePermission[...............................R=1]", BasePermission.READ.toString());
@@ -19,20 +19,12 @@ import org.springframework.security.acls.model.Permission;
/**
* A test permission.
*
*
* @author Ben Alex
* @version $Id$
*/
public class SpecialPermission extends BasePermission {
public static final Permission ENTER = new SpecialPermission(1 << 5, 'E'); // 32
/**
* Registers the public static permissions defined on this class. This is mandatory so
* that the static methods will operate correctly.
*/
static {
registerPermissionsFor(SpecialPermission.class);
}
protected SpecialPermission(int mask, char code) {
super(mask, code);