1
2
3
4
5
6
7
8
9
10
11 package org.mule.extras.jaas;
12
13 import org.mule.config.i18n.CoreMessages;
14 import org.mule.impl.security.MuleAuthentication;
15 import org.mule.umo.lifecycle.InitialisationException;
16 import org.mule.umo.security.UMOAuthentication;
17 import org.mule.umo.security.UMOSecurityContext;
18 import org.mule.umo.security.UMOSecurityContextFactory;
19 import org.mule.umo.security.UMOSecurityProvider;
20 import org.mule.umo.security.UnauthorisedException;
21 import org.mule.umo.security.UnknownAuthenticationTypeException;
22
23 import java.io.IOException;
24 import java.security.Security;
25 import java.util.HashMap;
26 import java.util.Map;
27
28 import javax.security.auth.login.AppConfigurationEntry;
29 import javax.security.auth.login.Configuration;
30 import javax.security.auth.login.LoginContext;
31 import javax.security.auth.login.LoginException;
32
33
34
35
36 public class JaasSimpleAuthenticationProvider implements UMOSecurityProvider
37 {
38
39 private String loginConfig;
40 private String loginContextName;
41 private String credentials;
42 private String loginModule;
43 private String defaultModule = "org.mule.extras.jaas.loginmodule.DefaultLoginModule";
44 private String name;
45 private UMOSecurityContextFactory factory;
46
47
48
49
50
51
52
53
54
55 public final void setLoginConfig(String loginConfig)
56 {
57 this.loginConfig = loginConfig;
58 }
59
60
61
62
63
64
65 public final String getLoginConfig()
66 {
67 return loginConfig;
68 }
69
70
71
72
73
74
75 public final void setLoginContextName(String loginContextName)
76 {
77 this.loginContextName = loginContextName;
78 }
79
80
81
82
83
84
85 public final String getLoginContextName()
86 {
87 return loginContextName;
88 }
89
90
91
92
93
94
95 public final String getCredentials()
96 {
97 return credentials;
98 }
99
100
101
102
103
104
105 public final void setCredentials(String credentials)
106 {
107 this.credentials = credentials;
108 }
109
110
111
112
113
114
115 public final String getLoginModule()
116 {
117 return loginModule;
118 }
119
120
121
122
123
124
125 public final void setLoginModule(String loginModule)
126 {
127 this.loginModule = loginModule;
128 }
129
130
131
132
133 public final String getName()
134 {
135 return name;
136 }
137
138
139
140
141 public final void setName(String name)
142 {
143 this.name = name;
144 }
145
146
147
148
149
150
151
152
153 private void configureJaas() throws IOException
154 {
155
156 String loginConfigUrl = "file://"
157 + org.mule.util.FileUtils.getResourcePath(loginConfig,
158 JaasSimpleAuthenticationProvider.class);
159
160 boolean alreadySet = false;
161
162 int n = 1;
163 String prefix = "login.config.url.";
164 String existing = null;
165
166 while ((existing = Security.getProperty(prefix + n)) != null)
167 {
168 alreadySet = existing.equals(loginConfigUrl);
169
170 if (alreadySet)
171 {
172 break;
173 }
174 n++;
175 }
176
177 if (!alreadySet)
178 {
179 String key = prefix + n;
180 Security.setProperty(key, loginConfigUrl);
181 }
182 }
183
184
185
186
187
188
189
190
191
192
193 public final UMOAuthentication authenticate(UMOAuthentication authentication)
194 throws org.mule.umo.security.SecurityException
195 {
196
197 LoginContext loginContext;
198 MuleAuthentication auth = (MuleAuthentication)authentication;
199
200
201 MuleCallbackHandler cbh = new MuleCallbackHandler(auth);
202
203
204 try
205 {
206 loginContext = new LoginContext(loginContextName, cbh);
207 }
208 catch (LoginException e)
209 {
210 throw new org.mule.umo.security.UnauthorisedException(
211 CoreMessages.cannotLoadFromClasspath(loginContextName));
212 }
213
214
215 try
216 {
217 loginContext.login();
218 }
219 catch (LoginException le)
220 {
221 throw new UnauthorisedException(CoreMessages.authFailedForUser(auth.getPrincipal()));
222 }
223
224 auth.setAuthenticated(true);
225
226 return auth;
227 }
228
229
230
231
232
233
234
235 public final boolean supports(Class aClass)
236 {
237 return UMOAuthentication.class.isAssignableFrom(aClass);
238 }
239
240
241
242
243
244
245 public final UMOSecurityContext createSecurityContext(UMOAuthentication auth)
246 throws UnknownAuthenticationTypeException
247 {
248 return factory.create(auth);
249 }
250
251
252
253
254
255
256
257
258
259
260 public final void initialise() throws InitialisationException
261 {
262
263
264 if (loginConfig == null)
265 {
266 try
267 {
268 AppConfigurationEntry entry = null;
269 JaasConfig.init();
270
271 HashMap options = new HashMap();
272 options.put("credentials", credentials);
273
274
275
276 if (loginModule != null)
277 {
278 entry = new AppConfigurationEntry(loginModule,
279 AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
280 }
281 else
282 {
283 entry = new AppConfigurationEntry(defaultModule,
284 AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
285 }
286
287 JaasConfig.addApplicationConfigEntry(loginContextName, entry);
288 }
289 catch (Exception e)
290 {
291 throw new InitialisationException(e, this);
292 }
293 }
294 else
295 {
296
297 try
298 {
299 configureJaas();
300 }
301 catch (IOException e)
302 {
303 throw new InitialisationException(e, this);
304 }
305 }
306
307
308 try
309 {
310 factory = new JaasSecurityContextFactory();
311 }
312 catch (Exception e)
313 {
314 throw new InitialisationException(CoreMessages.failedToCreate("JaasProvider"), e);
315 }
316 }
317
318
319
320
321
322 public static class JaasConfig extends Configuration
323 {
324
325 private static Map appConfigEntries = new HashMap();
326 private static JaasConfig jaasConfig;
327
328
329
330
331 public static void init()
332 {
333 jaasConfig = new JaasConfig();
334 Configuration.setConfiguration(jaasConfig);
335 }
336
337
338
339
340
341
342 public static JaasConfig getJaasConfig()
343 {
344 return jaasConfig;
345 }
346
347
348
349
350
351
352
353 public static void addApplicationConfigEntry(String name, AppConfigurationEntry entry)
354 {
355 appConfigEntries.put(name, entry);
356 }
357
358
359
360
361
362
363
364 public final AppConfigurationEntry[] getAppConfigurationEntry(String applicationName)
365 {
366
367 if (applicationName == null)
368 {
369 throw new IllegalArgumentException("applicationName passed in was null.");
370 }
371
372 AppConfigurationEntry entry = (AppConfigurationEntry)appConfigEntries.get(applicationName);
373 if (entry == null)
374 {
375 return new AppConfigurationEntry[]{};
376 }
377 else
378 {
379 AppConfigurationEntry e[] = new AppConfigurationEntry[1];
380 e[0] = entry;
381 return e;
382 }
383 }
384
385 public void refresh()
386 {
387
388 }
389 }
390 }