1
2
3
4
5
6
7
8
9
10
11 package org.mule.security;
12
13 import org.mule.api.EncryptionStrategy;
14 import org.mule.api.lifecycle.InitialisationException;
15 import org.mule.api.lifecycle.LifecycleTransitionResult;
16 import org.mule.api.security.Authentication;
17 import org.mule.api.security.SecurityContext;
18 import org.mule.api.security.SecurityException;
19 import org.mule.api.security.SecurityManager;
20 import org.mule.api.security.SecurityProvider;
21 import org.mule.api.security.SecurityProviderNotFoundException;
22 import org.mule.api.security.UnknownAuthenticationTypeException;
23
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.Collections;
27 import java.util.Iterator;
28 import java.util.LinkedList;
29 import java.util.List;
30 import java.util.Map;
31
32 import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap;
33
34 import org.apache.commons.logging.Log;
35 import org.apache.commons.logging.LogFactory;
36
37
38
39
40
41
42 public class MuleSecurityManager implements SecurityManager
43 {
44
45
46
47
48 protected static final Log logger = LogFactory.getLog(MuleSecurityManager.class);
49
50 private Map providers = new ConcurrentHashMap();
51 private Map cryptoStrategies = new ConcurrentHashMap();
52
53 public MuleSecurityManager()
54 {
55 super();
56 }
57
58 public void initialise() throws InitialisationException
59 {
60 List all = new LinkedList(providers.values());
61
62 all.addAll(cryptoStrategies.values());
63 LifecycleTransitionResult.initialiseAll(all.iterator());
64 }
65
66 public Authentication authenticate(Authentication authentication)
67 throws SecurityException, SecurityProviderNotFoundException
68 {
69 Iterator iter = providers.values().iterator();
70
71 Class toTest = authentication.getClass();
72
73 while (iter.hasNext())
74 {
75 SecurityProvider provider = (SecurityProvider) iter.next();
76
77 if (provider.supports(toTest))
78 {
79 if (logger.isDebugEnabled())
80 {
81 logger.debug("Authentication attempt using " + provider.getClass().getName());
82 }
83
84 Authentication result = provider.authenticate(authentication);
85
86 if (result != null)
87 {
88 return result;
89 }
90 }
91 }
92
93 throw new SecurityProviderNotFoundException(toTest.getName());
94 }
95
96 public void addProvider(SecurityProvider provider)
97 {
98 if (getProvider(provider.getName()) != null)
99 {
100 throw new IllegalArgumentException("Provider already registered: " + provider.getName());
101 }
102 providers.put(provider.getName(), provider);
103 }
104
105 public SecurityProvider getProvider(String name)
106 {
107 if (name == null)
108 {
109 throw new IllegalArgumentException("provider Name cannot be null");
110 }
111 return (SecurityProvider) providers.get(name);
112 }
113
114 public SecurityProvider removeProvider(String name)
115 {
116 return (SecurityProvider) providers.remove(name);
117 }
118
119 public Collection getProviders()
120 {
121 return Collections.unmodifiableCollection(new ArrayList(providers.values()));
122 }
123
124 public void setProviders(Collection providers)
125 {
126 for (Iterator iterator = providers.iterator(); iterator.hasNext();)
127 {
128 SecurityProvider provider = (SecurityProvider) iterator.next();
129 addProvider(provider);
130 }
131 }
132
133 public SecurityContext createSecurityContext(Authentication authentication)
134 throws UnknownAuthenticationTypeException
135 {
136 Iterator iter = providers.values().iterator();
137
138 Class toTest = authentication.getClass();
139
140 while (iter.hasNext())
141 {
142 SecurityProvider provider = (SecurityProvider) iter.next();
143
144 if (provider.supports(toTest))
145 {
146 return provider.createSecurityContext(authentication);
147 }
148 }
149 throw new UnknownAuthenticationTypeException(authentication);
150 }
151
152 public EncryptionStrategy getEncryptionStrategy(String name)
153 {
154 return (EncryptionStrategy) cryptoStrategies.get(name);
155 }
156
157 public void addEncryptionStrategy(EncryptionStrategy strategy)
158 {
159 cryptoStrategies.put(strategy.getName(), strategy);
160 }
161
162 public EncryptionStrategy removeEncryptionStrategy(String name)
163 {
164 return (EncryptionStrategy) cryptoStrategies.remove(name);
165
166 }
167
168 public Collection getEncryptionStrategies()
169 {
170 return Collections.unmodifiableCollection(new ArrayList(cryptoStrategies.values()));
171 }
172
173 public void setEncryptionStrategies(Collection strategies)
174 {
175 for (Iterator iterator = strategies.iterator(); iterator.hasNext();)
176 {
177 EncryptionStrategy strategy = (EncryptionStrategy) iterator.next();
178 addEncryptionStrategy(strategy);
179 }
180 }
181
182 }