]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.core/src/org/argeo/security/core/ThreadedLoginModule.java
Centralise login in Kernel
[lgpl/argeo-commons.git] / org.argeo.security.core / src / org / argeo / security / core / ThreadedLoginModule.java
diff --git a/org.argeo.security.core/src/org/argeo/security/core/ThreadedLoginModule.java b/org.argeo.security.core/src/org/argeo/security/core/ThreadedLoginModule.java
new file mode 100644 (file)
index 0000000..8ddac89
--- /dev/null
@@ -0,0 +1,50 @@
+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();
+       }
+
+}