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
215 return finalAuth;
216 }
217
218
219
220
221
222
223
224
225
226
227 protected void doInitialise() throws InitialisationException
228 {
229
230
231 if (loginConfig == null)
232 {
233 try
234 {
235 AppConfigurationEntry entry = null;
236 JaasConfig.init();
237
238 HashMap options = new HashMap();
239 options.put("credentials", credentials);
240
241
242
243 if (loginModule != null)
244 {
245 entry = new AppConfigurationEntry(loginModule,
246 AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
247 }
248 else
249 {
250 entry = new AppConfigurationEntry(defaultModule,
251 AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);
252 }
253
254 JaasConfig.addApplicationConfigEntry(loginContextName, entry);
255 }
256 catch (Exception e)
257 {
258 throw new InitialisationException(e, this);
259 }
260 }
261 else
262 {
263
264 try
265 {
266 configureJaas();
267 }
268 catch (IOException e)
269 {
270 throw new InitialisationException(e, this);
271 }
272 }
273 }
274
275
276
277
278
279 public static class JaasConfig extends Configuration
280 {
281
282 private static Map appConfigEntries = new HashMap();
283 private static JaasConfig jaasConfig;
284
285
286 public static void init()
287 {
288 jaasConfig = new JaasConfig();
289 Configuration.setConfiguration(jaasConfig);
290 }
291
292
293
294
295
296
297 public static JaasConfig getJaasConfig()
298 {
299 return jaasConfig;
300 }
301
302
303
304
305
306
307
308 public static void addApplicationConfigEntry(String name, AppConfigurationEntry entry)
309 {
310 appConfigEntries.put(name, entry);
311 }
312
313
314
315
316
317
318 public final AppConfigurationEntry[] getAppConfigurationEntry(String applicationName)
319 {
320
321 if (applicationName == null)
322 {
323 throw new IllegalArgumentException("applicationName passed in was null.");
324 }
325
326 AppConfigurationEntry entry = (AppConfigurationEntry) appConfigEntries.get(applicationName);
327 if (entry == null)
328 {
329 return new AppConfigurationEntry[]{};
330 }
331 else
332 {
333 AppConfigurationEntry e[] = new AppConfigurationEntry[1];
334 e[0] = entry;
335 return e;
336 }
337 }
338
339 public void refresh()
340 {
341
342 }
343 }
344 }