1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.acegisecurity.taglibs.authz;
17
18 import junit.framework.TestCase;
19
20 import org.acegisecurity.Authentication;
21 import org.acegisecurity.GrantedAuthority;
22 import org.acegisecurity.MockAclManager;
23 import org.acegisecurity.MockApplicationContext;
24 import org.acegisecurity.acl.AclEntry;
25 import org.acegisecurity.acl.AclManager;
26 import org.acegisecurity.acl.basic.MockAclObjectIdentity;
27 import org.acegisecurity.acl.basic.SimpleAclEntry;
28 import org.acegisecurity.context.SecurityContextHolder;
29 import org.acegisecurity.providers.TestingAuthenticationToken;
30
31 import org.springframework.context.ApplicationContext;
32 import org.springframework.context.ConfigurableApplicationContext;
33
34 import javax.servlet.jsp.JspException;
35 import javax.servlet.jsp.PageContext;
36 import javax.servlet.jsp.tagext.Tag;
37
38
39 /***
40 * Tests {@link AclTag}.
41 *
42 * @author Ben Alex
43 * @version $Id: AclTagTests.java,v 1.5 2005/11/17 00:55:51 benalex Exp $
44 */
45 public class AclTagTests extends TestCase {
46
47
48 private final MyAclTag aclTag = new MyAclTag();
49
50
51
52 public void testInclusionDeniedWhenAclManagerUnawareOfObject()
53 throws JspException {
54 Authentication auth = new TestingAuthenticationToken("marissa",
55 "koala", new GrantedAuthority[] {});
56 SecurityContextHolder.getContext().setAuthentication(auth);
57
58 aclTag.setHasPermission(new Long(SimpleAclEntry.ADMINISTRATION)
59 .toString());
60 aclTag.setDomainObject(new Integer(54));
61 assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
62
63 SecurityContextHolder.getContext().setAuthentication(null);
64 }
65
66 public void testInclusionDeniedWhenNoListOfPermissionsGiven()
67 throws JspException {
68 Authentication auth = new TestingAuthenticationToken("marissa",
69 "koala", new GrantedAuthority[] {});
70 SecurityContextHolder.getContext().setAuthentication(auth);
71
72 aclTag.setHasPermission(null);
73 aclTag.setDomainObject("object1");
74 assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
75
76 SecurityContextHolder.getContext().setAuthentication(null);
77 }
78
79 public void testInclusionDeniedWhenPrincipalDoesNotHoldAnyPermissions()
80 throws JspException {
81 Authentication auth = new TestingAuthenticationToken("john", "crow",
82 new GrantedAuthority[] {});
83 SecurityContextHolder.getContext().setAuthentication(auth);
84
85 aclTag.setHasPermission(new Integer(SimpleAclEntry.ADMINISTRATION)
86 + "," + new Integer(SimpleAclEntry.READ));
87 assertEquals(new Integer(SimpleAclEntry.ADMINISTRATION) + ","
88 + new Integer(SimpleAclEntry.READ), aclTag.getHasPermission());
89 aclTag.setDomainObject("object1");
90 assertEquals("object1", aclTag.getDomainObject());
91 assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
92
93 SecurityContextHolder.getContext().setAuthentication(null);
94 }
95
96 public void testInclusionDeniedWhenPrincipalDoesNotHoldRequiredPermissions()
97 throws JspException {
98 Authentication auth = new TestingAuthenticationToken("marissa",
99 "koala", new GrantedAuthority[] {});
100 SecurityContextHolder.getContext().setAuthentication(auth);
101
102 aclTag.setHasPermission(new Integer(SimpleAclEntry.DELETE).toString());
103 aclTag.setDomainObject("object1");
104 assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
105
106 SecurityContextHolder.getContext().setAuthentication(null);
107 }
108
109 public void testInclusionDeniedWhenSecurityContextEmpty()
110 throws JspException {
111 SecurityContextHolder.getContext().setAuthentication(null);
112
113 aclTag.setHasPermission(new Long(SimpleAclEntry.ADMINISTRATION)
114 .toString());
115 aclTag.setDomainObject("object1");
116 assertEquals(Tag.SKIP_BODY, aclTag.doStartTag());
117
118 SecurityContextHolder.getContext().setAuthentication(null);
119 }
120
121 public void testInclusionPermittedWhenDomainObjectIsNull()
122 throws JspException {
123 aclTag.setHasPermission(new Integer(SimpleAclEntry.READ).toString());
124 aclTag.setDomainObject(null);
125 assertEquals(Tag.EVAL_BODY_INCLUDE, aclTag.doStartTag());
126 }
127
128 public void testJspExceptionThrownIfHasPermissionNotValidFormat()
129 throws JspException {
130 Authentication auth = new TestingAuthenticationToken("john", "crow",
131 new GrantedAuthority[] {});
132 SecurityContextHolder.getContext().setAuthentication(auth);
133
134 aclTag.setHasPermission("0,5, 6");
135
136 try {
137 aclTag.doStartTag();
138 fail("Should have thrown JspException");
139 } catch (JspException expected) {
140 assertTrue(true);
141 }
142
143 SecurityContextHolder.getContext().setAuthentication(null);
144 }
145
146 public void testOperationWhenPrincipalHoldsPermissionOfMultipleList()
147 throws JspException {
148 Authentication auth = new TestingAuthenticationToken("marissa",
149 "koala", new GrantedAuthority[] {});
150 SecurityContextHolder.getContext().setAuthentication(auth);
151
152 aclTag.setHasPermission(new Integer(SimpleAclEntry.ADMINISTRATION)
153 + "," + new Integer(SimpleAclEntry.READ));
154 aclTag.setDomainObject("object1");
155 assertEquals(Tag.EVAL_BODY_INCLUDE, aclTag.doStartTag());
156
157 SecurityContextHolder.getContext().setAuthentication(null);
158 }
159
160 public void testOperationWhenPrincipalHoldsPermissionOfSingleList()
161 throws JspException {
162 Authentication auth = new TestingAuthenticationToken("marissa",
163 "koala", new GrantedAuthority[] {});
164 SecurityContextHolder.getContext().setAuthentication(auth);
165
166 aclTag.setHasPermission(new Integer(SimpleAclEntry.READ).toString());
167 aclTag.setDomainObject("object1");
168 assertEquals(Tag.EVAL_BODY_INCLUDE, aclTag.doStartTag());
169
170 SecurityContextHolder.getContext().setAuthentication(null);
171 }
172
173
174
175 private class MockAclEntry implements AclEntry {
176
177 }
178
179 private class MyAclTag extends AclTag {
180 protected ApplicationContext getContext(PageContext pageContext) {
181 ConfigurableApplicationContext context = MockApplicationContext
182 .getContext();
183
184
185 AclManager aclManager = new MockAclManager("object1", "marissa",
186 new AclEntry[] {new MockAclEntry(), new SimpleAclEntry(
187 "marissa", new MockAclObjectIdentity(), null,
188 SimpleAclEntry.ADMINISTRATION), new SimpleAclEntry(
189 "marissa", new MockAclObjectIdentity(), null,
190 SimpleAclEntry.READ)});
191
192
193 context.getBeanFactory().registerSingleton("aclManager", aclManager);
194
195 return context;
196 }
197 }
198 }