--- /dev/null
+package org.argeo.security.core;
+
+import java.util.Map;
+
+import javax.security.auth.Subject;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.spi.LoginModule;
+
+/** Attach login modules to threads. */
+public abstract class ThreadedLoginModule implements LoginModule {
+ private ThreadLocal<LoginModule> loginModule = new ThreadLocal<LoginModule>() {
+
+ @Override
+ protected LoginModule initialValue() {
+ return createLoginModule();
+ }
+
+ };
+
+ protected abstract LoginModule createLoginModule();
+
+ @Override
+ public void initialize(Subject subject, CallbackHandler callbackHandler,
+ Map<String, ?> sharedState, Map<String, ?> options) {
+ loginModule.get().initialize(subject, callbackHandler, sharedState,
+ options);
+ }
+
+ @Override
+ public boolean login() throws LoginException {
+ return loginModule.get().login();
+ }
+
+ @Override
+ public boolean commit() throws LoginException {
+ return loginModule.get().commit();
+ }
+
+ @Override
+ public boolean abort() throws LoginException {
+ return loginModule.get().abort();
+ }
+
+ @Override
+ public boolean logout() throws LoginException {
+ return loginModule.get().logout();
+ }
+
+}