From: Robert Varga Date: Sun, 3 Jul 2022 02:25:08 +0000 (+0200) Subject: Migrate more ThreadLocals X-Git-Tag: v0.16.0~22 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=4f87ed41a93f8306ca1e468b573cf684faec4c19;p=aaa.git Migrate more ThreadLocals Move ThreadLocal instances to their sole consumer. Change-Id: Ie46be3801d12987ca3cb3014b5e66096379fce7b Signed-off-by: Robert Varga --- diff --git a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealm.java b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealm.java index 4a6bcd57f..bb8048dd9 100644 --- a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealm.java +++ b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealm.java @@ -7,6 +7,7 @@ */ package org.opendaylight.aaa.shiro.realm; +import static com.google.common.base.Verify.verifyNotNull; import static java.util.Objects.requireNonNull; import com.google.common.base.Strings; @@ -20,6 +21,7 @@ import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.aaa.api.Authentication; import org.opendaylight.aaa.api.AuthenticationService; import org.opendaylight.aaa.api.TokenAuth; @@ -28,8 +30,8 @@ import org.opendaylight.aaa.api.shiro.principal.ODLPrincipal; import org.opendaylight.aaa.shiro.principal.ODLPrincipalImpl; import org.opendaylight.aaa.shiro.realm.util.TokenUtils; import org.opendaylight.aaa.shiro.realm.util.http.header.HeaderUtils; -import org.opendaylight.aaa.shiro.web.env.ThreadLocals; import org.opendaylight.aaa.tokenauthrealm.auth.TokenAuthenticators; +import org.opendaylight.yangtools.concepts.Registration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,18 +41,46 @@ import org.slf4j.LoggerFactory; */ public class TokenAuthRealm extends AuthorizingRealm { private static final Logger LOG = LoggerFactory.getLogger(TokenAuthRealm.class); + private static final ThreadLocal AUTHENICATORS_TL = new ThreadLocal<>(); + private static final ThreadLocal AUTH_SERVICE_TL = new ThreadLocal<>(); + private static final ThreadLocal TOKEN_STORE_TL = new ThreadLocal<>(); - private final AuthenticationService authenticationService; + private final TokenAuthenticators authenticators; + private final AuthenticationService authService; private final TokenStore tokenStore; - private final TokenAuthenticators tokenAuthenticators; public TokenAuthRealm() { - authenticationService = requireNonNull(ThreadLocals.AUTH_SETVICE_TL.get()); - tokenStore = ThreadLocals.TOKEN_STORE_TL.get(); - tokenAuthenticators = requireNonNull(ThreadLocals.TOKEN_AUTHENICATORS_TL.get()); + this(verifyLoad(AUTH_SERVICE_TL), verifyLoad(AUTHENICATORS_TL), TOKEN_STORE_TL.get()); + } + + public TokenAuthRealm(final AuthenticationService authService, final TokenAuthenticators authenticators) { + this(authService, authenticators, null); + } + + public TokenAuthRealm(final AuthenticationService authService, final TokenAuthenticators authenticators, + final @Nullable TokenStore tokenStore) { + this.authService = requireNonNull(authService); + this.authenticators = requireNonNull(authenticators); + this.tokenStore = tokenStore; super.setName("TokenAuthRealm"); } + public static Registration prepareForLoad(final AuthenticationService authService, + final TokenAuthenticators authenticators, final @Nullable TokenStore tokenStore) { + AUTH_SERVICE_TL.set(requireNonNull(authService)); + AUTHENICATORS_TL.set(requireNonNull(authenticators)); + TOKEN_STORE_TL.set(tokenStore); + return () -> { + AUTH_SERVICE_TL.remove(); + AUTHENICATORS_TL.remove(); + TOKEN_STORE_TL.remove(); + }; + } + + private static T verifyLoad(final ThreadLocal threadLocal) { + return verifyNotNull(threadLocal.get(), "TokenAuthRealm loading not prepared"); + } + /** * {@inheritDoc} * @@ -101,13 +131,13 @@ public class TokenAuthRealm extends AuthorizingRealm { // iterate over TokenAuth implementations and // attempt to // authentication with each one - for (TokenAuth ta : tokenAuthenticators.getTokenAuthCollection()) { + for (TokenAuth ta : authenticators.getTokenAuthCollection()) { try { LOG.debug("Authentication attempt using {}", ta.getClass().getName()); final Authentication auth = ta.validate(headers); if (auth != null) { LOG.debug("Authentication attempt successful"); - authenticationService.set(auth); + authService.set(auth); final ODLPrincipal odlPrincipal = ODLPrincipalImpl.createODLPrincipal(auth); return new SimpleAuthenticationInfo(odlPrincipal, password.toCharArray(), getName()); } @@ -142,7 +172,7 @@ public class TokenAuthRealm extends AuthorizingRealm { if (auth == null) { throw new AuthenticationException("Could not validate the token " + token); } - authenticationService.set(auth); + authService.set(auth); return auth; } } diff --git a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/web/env/AAAIniWebEnvironment.java b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/web/env/AAAIniWebEnvironment.java index 87956637b..f085e5694 100644 --- a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/web/env/AAAIniWebEnvironment.java +++ b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/web/env/AAAIniWebEnvironment.java @@ -20,6 +20,7 @@ import org.opendaylight.aaa.api.password.service.PasswordHashService; import org.opendaylight.aaa.cert.api.ICertificateManager; import org.opendaylight.aaa.shiro.realm.KeystoneAuthRealm; import org.opendaylight.aaa.shiro.realm.MoonRealm; +import org.opendaylight.aaa.shiro.realm.TokenAuthRealm; import org.opendaylight.aaa.tokenauthrealm.auth.TokenAuthenticators; import org.opendaylight.aaa.web.servlet.ServletSupport; import org.opendaylight.mdsal.binding.api.DataBroker; @@ -94,25 +95,21 @@ class AAAIniWebEnvironment extends IniWebEnvironment { @Override public void init() { ThreadLocals.DATABROKER_TL.set(dataBroker); - ThreadLocals.AUTH_SETVICE_TL.set(authenticationService); - ThreadLocals.TOKEN_AUTHENICATORS_TL.set(tokenAuthenticators); - ThreadLocals.TOKEN_STORE_TL.set(tokenStore); ThreadLocals.PASSWORD_HASH_SERVICE_TL.set(passwordHashService); - try (var keyStoneLoad = KeystoneAuthRealm.prepareForLoad(certificateManager)) { - try (var moonLoad = MoonRealm.prepareForLoad(servletSupport)) { - // Initialize the Shiro environment from clustered-app-config - final Ini ini = createIniFromClusteredAppConfig(shiroConfiguration); - setIni(ini); - ClassLoaderUtils.getWithClassLoader(AAAIniWebEnvironment.class.getClassLoader(), () -> { - super.init(); - return null; - }); - } + try ( + var keyStoneLoad = KeystoneAuthRealm.prepareForLoad(certificateManager); + var moonLoad = MoonRealm.prepareForLoad(servletSupport); + var tokenAuthLoad = TokenAuthRealm.prepareForLoad(authenticationService, tokenAuthenticators, tokenStore)) { + + // Initialize the Shiro environment from clustered-app-config + final Ini ini = createIniFromClusteredAppConfig(shiroConfiguration); + setIni(ini); + ClassLoaderUtils.getWithClassLoader(AAAIniWebEnvironment.class.getClassLoader(), () -> { + super.init(); + return null; + }); } finally { ThreadLocals.DATABROKER_TL.remove(); - ThreadLocals.AUTH_SETVICE_TL.remove(); - ThreadLocals.TOKEN_AUTHENICATORS_TL.remove(); - ThreadLocals.TOKEN_STORE_TL.remove(); ThreadLocals.PASSWORD_HASH_SERVICE_TL.remove(); } } diff --git a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/web/env/ThreadLocals.java b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/web/env/ThreadLocals.java index aed2ae91f..469c7fbfc 100644 --- a/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/web/env/ThreadLocals.java +++ b/aaa-shiro/impl/src/main/java/org/opendaylight/aaa/shiro/web/env/ThreadLocals.java @@ -7,10 +7,7 @@ */ package org.opendaylight.aaa.shiro.web.env; -import org.opendaylight.aaa.api.AuthenticationService; -import org.opendaylight.aaa.api.TokenStore; import org.opendaylight.aaa.api.password.service.PasswordHashService; -import org.opendaylight.aaa.tokenauthrealm.auth.TokenAuthenticators; import org.opendaylight.mdsal.binding.api.DataBroker; /** @@ -22,12 +19,6 @@ import org.opendaylight.mdsal.binding.api.DataBroker; public final class ThreadLocals { public static final ThreadLocal DATABROKER_TL = new ThreadLocal<>(); - public static final ThreadLocal AUTH_SETVICE_TL = new ThreadLocal<>(); - - public static final ThreadLocal TOKEN_STORE_TL = new ThreadLocal<>(); - - public static final ThreadLocal TOKEN_AUTHENICATORS_TL = new ThreadLocal<>(); - public static final ThreadLocal PASSWORD_HASH_SERVICE_TL = new ThreadLocal<>(); private ThreadLocals() { diff --git a/aaa-shiro/impl/src/test/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealmTest.java b/aaa-shiro/impl/src/test/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealmTest.java index 6070618f3..3c77ec980 100644 --- a/aaa-shiro/impl/src/test/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealmTest.java +++ b/aaa-shiro/impl/src/test/java/org/opendaylight/aaa/shiro/realm/TokenAuthRealmTest.java @@ -19,24 +19,14 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.shiro.authc.AuthenticationToken; -import org.junit.Before; import org.junit.Test; import org.opendaylight.aaa.shiro.realm.util.TokenUtils; import org.opendaylight.aaa.shiro.realm.util.http.header.HeaderUtils; -import org.opendaylight.aaa.shiro.web.env.ThreadLocals; import org.opendaylight.aaa.tokenauthrealm.auth.AuthenticationManager; import org.opendaylight.aaa.tokenauthrealm.auth.TokenAuthenticators; public class TokenAuthRealmTest { - - private TokenAuthRealm testRealm; - - @Before - public void setup() { - ThreadLocals.AUTH_SETVICE_TL.set(new AuthenticationManager()); - ThreadLocals.TOKEN_AUTHENICATORS_TL.set(new TokenAuthenticators()); - testRealm = new TokenAuthRealm(); - } + private final TokenAuthRealm testRealm = new TokenAuthRealm(new AuthenticationManager(), new TokenAuthenticators()); @Test public void testTokenAuthRealm() {