~mortenoh/+junk/dhis2-detailed-import-export

« back to all changes in this revision

Viewing changes to dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/security/vote/LogicalOrAccessDecisionManager.java

  • Committer: larshelge at gmail
  • Date: 2009-03-03 16:46:36 UTC
  • Revision ID: larshelge@gmail.com-20090303164636-2sjlrquo7ib1gf7r
Initial check-in

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.hisp.dhis.security.vote;
 
2
 
 
3
/*
 
4
 * Copyright (c) 2004-2007, University of Oslo
 
5
 * All rights reserved.
 
6
 *
 
7
 * Redistribution and use in source and binary forms, with or without
 
8
 * modification, are permitted provided that the following conditions are met:
 
9
 * * Redistributions of source code must retain the above copyright notice, this
 
10
 *   list of conditions and the following disclaimer.
 
11
 * * Redistributions in binary form must reproduce the above copyright notice,
 
12
 *   this list of conditions and the following disclaimer in the documentation
 
13
 *   and/or other materials provided with the distribution.
 
14
 * * Neither the name of the HISP project nor the names of its contributors may
 
15
 *   be used to endorse or promote products derived from this software without
 
16
 *   specific prior written permission.
 
17
 *
 
18
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 
19
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 
20
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 
21
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 
22
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 
23
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
24
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 
25
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 
27
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
28
 */
 
29
 
 
30
import java.util.Collections;
 
31
import java.util.List;
 
32
 
 
33
import org.acegisecurity.AccessDecisionManager;
 
34
import org.acegisecurity.AccessDeniedException;
 
35
import org.acegisecurity.Authentication;
 
36
import org.acegisecurity.ConfigAttribute;
 
37
import org.acegisecurity.ConfigAttributeDefinition;
 
38
import org.acegisecurity.InsufficientAuthenticationException;
 
39
import org.apache.commons.logging.Log;
 
40
import org.apache.commons.logging.LogFactory;
 
41
 
 
42
/**
 
43
 * AccessDecisionManager which delegates to other AccessDecisionManagers in a
 
44
 * logical or fashion. Delegation is stopped at the first positive answer from
 
45
 * the delegates, where the order of execution is defined by the list of
 
46
 * AccessDecisionManagers. So if the first AccessDecisionManager grants access
 
47
 * for a specific target, no other AccessDecisionManager is questioned. 
 
48
 * 
 
49
 * @author Torgeir Lorange Ostby
 
50
 * @version $Id: LogicalOrAccessDecisionManager.java 6335 2008-11-20 11:11:26Z larshelg $
 
51
 */
 
52
public class LogicalOrAccessDecisionManager
 
53
    implements AccessDecisionManager
 
54
{
 
55
    private static final Log LOG = LogFactory.getLog( LogicalOrAccessDecisionManager.class );
 
56
 
 
57
    private List<AccessDecisionManager> accessDecisionManagers = Collections.emptyList();
 
58
 
 
59
    public void setAccessDecisionManagers( List<AccessDecisionManager> accessDecisionManagers )
 
60
    {
 
61
        this.accessDecisionManagers = accessDecisionManagers;
 
62
    }
 
63
 
 
64
    // -------------------------------------------------------------------------
 
65
    // Interface implementation
 
66
    // -------------------------------------------------------------------------
 
67
 
 
68
    public void decide( Authentication authentication, Object object, ConfigAttributeDefinition definition )
 
69
        throws AccessDeniedException, InsufficientAuthenticationException
 
70
    {
 
71
        AccessDeniedException ade = null;
 
72
        InsufficientAuthenticationException iae = null;
 
73
 
 
74
        for ( AccessDecisionManager accessDecisionManager : accessDecisionManagers )
 
75
        {
 
76
            try
 
77
            {
 
78
                accessDecisionManager.decide( authentication, object, definition );
 
79
 
 
80
                LOG.debug( "ACCESS GRANTED [" + object.toString() + "]" );
 
81
 
 
82
                return;
 
83
            }
 
84
            catch ( AccessDeniedException e )
 
85
            {
 
86
                ade = e;
 
87
            }
 
88
            catch ( InsufficientAuthenticationException e )
 
89
            {
 
90
                iae = e;
 
91
            }
 
92
        }
 
93
 
 
94
        LOG.debug( "ACCESS DENIED [" + object.toString() + "]" );
 
95
 
 
96
        if ( ade != null )
 
97
        {
 
98
            throw ade;
 
99
        }
 
100
 
 
101
        if ( iae != null )
 
102
        {
 
103
            throw iae;
 
104
        }
 
105
    }
 
106
 
 
107
    public boolean supports( ConfigAttribute configAttribute )
 
108
    {
 
109
        for ( AccessDecisionManager accessDecisionManager : accessDecisionManagers )
 
110
        {
 
111
            if ( accessDecisionManager.supports( configAttribute ) )
 
112
            {
 
113
                return true;
 
114
            }
 
115
        }
 
116
 
 
117
        return false;
 
118
    }
 
119
 
 
120
    @SuppressWarnings( "unchecked" )
 
121
    public boolean supports( Class clazz )
 
122
    {
 
123
        for ( AccessDecisionManager accessDecisionManager : accessDecisionManagers )
 
124
        {
 
125
            if ( accessDecisionManager.supports( clazz ) )
 
126
            {
 
127
                return true;
 
128
            }
 
129
        }
 
130
 
 
131
        return false;
 
132
    }
 
133
}