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