1 /* Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 package org.acegisecurity;
17
18 /**
19 * Reviews the <code>Object</code> returned from a secure object invocation,
20 * being able to modify the <code>Object</code> or throw an {@link
21 * AccessDeniedException}.
22 *
23 * <p>
24 * Typically used to ensure the principal is permitted to access the domain
25 * object instance returned by a service layer bean. Can also be used to
26 * mutate the domain object instance so the principal is only able to access
27 * authorised bean properties or <code>Collection</code> elements. Often used
28 * in conjunction with an {@link org.acegisecurity.acl.AclManager} to
29 * obtain the access control list applicable for the domain object instance.
30 * </p>
31 *
32 * <p>
33 * Special consideration should be given to using an
34 * <code>AfterInvocationManager</code> on bean methods that modify a database.
35 * Typically an <code>AfterInvocationManager</code> is used with read-only
36 * methods, such as <code>public DomainObject getById(id)</code>. If used with
37 * methods that modify a database, a transaction manager should be used to
38 * ensure any <code>AccessDeniedException</code> will cause a rollback of the
39 * changes made by the transaction.
40 * </p>
41 *
42 * @author Ben Alex
43 * @version $Id: AfterInvocationManager.java 1784 2007-02-24 21:00:24Z luke_t $
44 */
45 public interface AfterInvocationManager {
46 //~ Methods ========================================================================================================
47
48 /**
49 * Given the details of a secure object invocation including its returned <code>Object</code>, make an
50 * access control decision or optionally modify the returned <code>Object</code>.
51 *
52 * @param authentication the caller that invoked the method
53 * @param object the secured object that was called
54 * @param config the configuration attributes associated with the secured object that was invoked
55 * @param returnedObject the <code>Object</code> that was returned from the secure object invocation
56 *
57 * @return the <code>Object</code> that will ultimately be returned to the caller (if an implementation does not
58 * wish to modify the object to be returned to the caller, the implementation should simply return the
59 * same object it was passed by the <code>returnedObject</code> method argument)
60 *
61 * @throws AccessDeniedException if access is denied
62 */
63 Object decide(Authentication authentication, Object object, ConfigAttributeDefinition config,
64 Object returnedObject) throws AccessDeniedException;
65
66 /**
67 * Indicates whether this <code>AfterInvocationManager</code> is able to process "after invocation"
68 * requests presented with the passed <code>ConfigAttribute</code>.<p>This allows the
69 * <code>AbstractSecurityInterceptor</code> to check every configuration attribute can be consumed by the
70 * configured <code>AccessDecisionManager</code> and/or <code>RunAsManager</code> and/or
71 * <code>AfterInvocationManager</code>.</p>
72 *
73 * @param attribute a configuration attribute that has been configured against the
74 * <code>AbstractSecurityInterceptor</code>
75 *
76 * @return true if this <code>AfterInvocationManager</code> can support the passed configuration attribute
77 */
78 boolean supports(ConfigAttribute attribute);
79
80 /**
81 * Indicates whether the <code>AfterInvocationManager</code> implementation is able to provide access
82 * control decisions for the indicated secured object type.
83 *
84 * @param clazz the class that is being queried
85 *
86 * @return <code>true</code> if the implementation can process the indicated class
87 */
88 boolean supports(Class clazz);
89 }