Added test class for AccessControlListTag.

This commit is contained in:
Luke Taylor 2009-09-16 19:20:07 +00:00
parent 9f76db0606
commit 9374bddceb
3 changed files with 115 additions and 16 deletions
acl/src/main/java/org/springframework/security/acls/domain
taglibs/src
main/java/org/springframework/security/taglibs/authz
test/java/org/springframework/security/taglibs/authz

@ -97,7 +97,7 @@ public class DefaultPermissionFactory implements PermissionFactory {
public Permission buildFromMask(int mask) {
if (registeredPermissionsByInteger.containsKey(Integer.valueOf(mask))) {
// The requested mask has an exact match against a statically-defined Permission, so return it
return (Permission) registeredPermissionsByInteger.get(new Integer(mask));
return registeredPermissionsByInteger.get(new Integer(mask));
}
// To get this far, we have to use a CumulativePermission
@ -107,8 +107,11 @@ public class DefaultPermissionFactory implements PermissionFactory {
int permissionToCheck = 1 << i;
if ((mask & permissionToCheck) == permissionToCheck) {
Permission p = (Permission) registeredPermissionsByInteger.get(Integer.valueOf(permissionToCheck));
Assert.state(p != null, "Mask " + permissionToCheck + " does not have a corresponding static Permission");
Permission p = registeredPermissionsByInteger.get(Integer.valueOf(permissionToCheck));
if (p == null) {
throw new IllegalStateException("Mask '" + permissionToCheck + "' does not have a corresponding static Permission");
}
permission.set(p);
}
}
@ -131,9 +134,13 @@ public class DefaultPermissionFactory implements PermissionFactory {
// }
public Permission buildFromName(String name) {
Assert.isTrue(registeredPermissionsByName.containsKey(name), "Unknown permission '" + name + "'");
Permission p = registeredPermissionsByName.get(name);
return (Permission) registeredPermissionsByName.get(name);
if (p == null) {
throw new IllegalArgumentException("Unknown permission '" + name + "'");
}
return p;
}
public List<Permission> buildFromNames(List<String> names) {

@ -92,13 +92,7 @@ public class AccessControlListTag extends TagSupport {
final String evaledPermissionsString = ExpressionEvaluationUtils.evaluateString("hasPermission", hasPermission,
pageContext);
List<Permission> requiredPermissions = null;
try {
requiredPermissions = parsePermissionsString(evaledPermissionsString);
} catch (NumberFormatException nfe) {
throw new JspException(nfe);
}
List<Permission> requiredPermissions = parsePermissionsString(evaledPermissionsString);
Object resolvedDomainObject = null;
@ -212,14 +206,19 @@ public class AccessControlListTag extends TagSupport {
+ "application context - you must have only have one!");
}
private List<Permission> parsePermissionsString(String integersString) throws NumberFormatException {
private List<Permission> parsePermissionsString(String permissionsString) throws NumberFormatException {
final Set<Permission> permissions = new HashSet<Permission>();
final StringTokenizer tokenizer;
tokenizer = new StringTokenizer(integersString, ",", false);
tokenizer = new StringTokenizer(permissionsString, ",", false);
while (tokenizer.hasMoreTokens()) {
String integer = tokenizer.nextToken();
permissions.add(permissionFactory.buildFromMask(new Integer(integer)));
String permission = tokenizer.nextToken();
try {
permissions.add(permissionFactory.buildFromMask(Integer.valueOf(permission)));
} catch (NumberFormatException nfe) {
// Not an integer mask. Try using a name
permissions.add(permissionFactory.buildFromName(permission));
}
}
return new ArrayList<Permission>(permissions);

@ -0,0 +1,93 @@
package org.springframework.security.taglibs.authz;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.jsp.tagext.Tag;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.mock.web.MockPageContext;
import org.springframework.mock.web.MockServletContext;
import org.springframework.security.acls.AclPermissionEvaluator;
import org.springframework.security.acls.model.Acl;
import org.springframework.security.acls.model.AclService;
import org.springframework.security.acls.model.ObjectIdentity;
import org.springframework.security.acls.model.ObjectIdentityRetrievalStrategy;
import org.springframework.security.acls.model.SidRetrievalStrategy;
import org.springframework.security.authentication.TestingAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.context.WebApplicationContext;
/**
*
* @author Luke Taylor
* @version $Id$
* @since 3.0
*/
@SuppressWarnings("unchecked")
public class AccessControlListTagTests {
AccessControlListTag tag;
Acl acl;
@Before
public void setup() {
SecurityContextHolder.getContext().setAuthentication(new TestingAuthenticationToken("bob","bobspass","A"));
tag = new AccessControlListTag();
WebApplicationContext ctx = mock(WebApplicationContext.class);
AclService service = mock(AclService.class);
AclPermissionEvaluator pe = new AclPermissionEvaluator(service);
ObjectIdentity oid = mock(ObjectIdentity.class);
ObjectIdentityRetrievalStrategy oidStrategy = mock(ObjectIdentityRetrievalStrategy.class);
when(oidStrategy.getObjectIdentity(anyObject())).thenReturn(oid);
pe.setObjectIdentityRetrievalStrategy(oidStrategy);
pe.setSidRetrievalStrategy(mock(SidRetrievalStrategy.class));
acl = mock(Acl.class);
when(service.readAclById(any(ObjectIdentity.class), anyList())).thenReturn(acl);
Map beanMap = new HashMap();
beanMap.put("service", service);
when(ctx.getBeansOfType(AclService.class)).thenReturn(beanMap);
beanMap = new HashMap();
beanMap.put("oidStrategy", oidStrategy);
when(ctx.getBeansOfType(ObjectIdentityRetrievalStrategy.class)).thenReturn(beanMap);
MockServletContext servletCtx = new MockServletContext();
servletCtx.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ctx);
tag.setPageContext(new MockPageContext(servletCtx, new MockHttpServletRequest(), new MockHttpServletResponse()));
}
@After
public void clearContext() {
SecurityContextHolder.clearContext();
}
@Test
public void bodyIsEvaluatedIfAclGrantsAccess() throws Exception {
when(acl.isGranted(anyList(), anyList(), eq(false))).thenReturn(true);
tag.setDomainObject(new Object());
tag.setHasPermission("READ");
assertEquals(Tag.EVAL_BODY_INCLUDE, tag.doStartTag());
}
@Test
public void bodyIsSkippedIfAclDeniesAccess() throws Exception {
when(acl.isGranted(anyList(), anyList(), eq(false))).thenReturn(false);
tag.setDomainObject(new Object());
tag.setHasPermission("READ");
assertEquals(Tag.SKIP_BODY, tag.doStartTag());
}
}