You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2019/12/07 11:48:29 UTC

[isis] 01/06: ISIS-2218: renames AuthenticationManagerDefault (class) to AuthenticationManager

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit e94e1d7479fc1e68a453a6b10f514719b3acb4d4
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Sat Dec 7 10:17:00 2019 +0000

    ISIS-2218: renames AuthenticationManagerDefault (class) to AuthenticationManager
    
    Latter was previously an interface.
    
     Also:
    - KeycloakAuthenticator renamed as AuthenticatorKeycloak, declared as @Service rather than @Bean
    - ditto for shiro
    - constructor injection for AuthenticationManager
---
 .../isis/security/api/IsisModuleSecurityApi.java   |   6 +-
 .../api/authentication/AuthenticationSession.java  |   3 +-
 .../AuthenticationRequestLogonFixture.java         |   4 +-
 .../manager/AuthenticationManager.java             | 151 +++++++++++++--
 .../standard/AuthenticationManagerDefault.java     | 206 ---------------------
 .../standard/AuthenticatorAbstract.java            |   4 +-
 .../standard/AuthenticatorDefault.java             |  28 ---
 .../PasswordRequestAuthenticatorAbstract.java      |  36 ----
 ...0Chars.java => RandomCodeGeneratorDefault.java} |  18 +-
 .../standard/RandomCodeGeneratorUUID.java          |  40 ----
 .../api/authentication/standard/Registrar.java     |   7 -
 .../standard/RegistrationDetailsPassword.java      |  18 +-
 ...rdAuthenticationManager_AuthenticationTest.java |   9 +-
 ...rdAuthenticationManager_AuthenticatorsTest.java |   8 +-
 .../keycloak/IsisModuleSecurityKeycloak.java       |  10 +-
 ...thenticator.java => AuthenticatorKeycloak.java} |  34 ++--
 .../keycloak/webmodule/WebModuleKeycloak.java      |   2 +-
 .../security/shiro/IsisModuleSecurityShiro.java    |   9 +-
 ...oAuthenticator.java => AuthenticatorShiro.java} |  48 +++--
 .../security/shiro/webmodule/WebModuleShiro.java   |   2 +-
 ...AuthenticatorOrAuthorizorTest_authenticate.java |   6 +-
 ...ticatorOrAuthorizorTest_isVisibleInAnyRole.java |   6 +-
 .../components/AuthenticationManagerNull.java      |  56 ------
 23 files changed, 226 insertions(+), 485 deletions(-)

diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/IsisModuleSecurityApi.java b/core/security/api/src/main/java/org/apache/isis/security/api/IsisModuleSecurityApi.java
index fbe7609..5bff1eb 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/IsisModuleSecurityApi.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/IsisModuleSecurityApi.java
@@ -18,14 +18,16 @@
  */
 package org.apache.isis.security.api;
 
-import org.apache.isis.security.api.authentication.standard.AuthenticationManagerDefault;
+import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
+import org.apache.isis.security.api.authentication.standard.RandomCodeGeneratorDefault;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
 @Configuration
 @Import({
         // @Service's
-        AuthenticationManagerDefault.class
+        AuthenticationManager.class,
+        RandomCodeGeneratorDefault.class,
 })
 public class IsisModuleSecurityApi {
 }
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/AuthenticationSession.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/AuthenticationSession.java
index 14fc5e6..2331198 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/AuthenticationSession.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/AuthenticationSession.java
@@ -27,7 +27,6 @@ import java.util.stream.Stream;
 import org.apache.isis.applib.security.UserMemento;
 import org.apache.isis.commons.internal.encoding.Encodable;
 import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
-import org.apache.isis.security.api.authentication.standard.AuthenticationManagerDefault;
 
 /**
  * The representation within the system of an authenticated user.
@@ -102,7 +101,7 @@ public interface AuthenticationSession extends Encodable, Serializable {
     public enum Type {
         DEFAULT,
         /**
-         * Instructs the {@link AuthenticationManagerDefault} to not cache this session in its internal map of
+         * Instructs the {@link AuthenticationManager} to not cache this session in its internal map of
          * sessions by validation code, and therefore to ignore this aspect when considering if an
          * {@link AuthenticationSession} is
          * {@link AuthenticationManager#isSessionValid(AuthenticationSession) valid} or not.
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/fixtures/AuthenticationRequestLogonFixture.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/fixtures/AuthenticationRequestLogonFixture.java
index 3d62f58..f268b67 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/fixtures/AuthenticationRequestLogonFixture.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/fixtures/AuthenticationRequestLogonFixture.java
@@ -24,13 +24,13 @@ import java.util.Collections;
 
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.security.api.authentication.AuthenticationRequestAbstract;
-import org.apache.isis.security.api.authentication.standard.AuthenticationManagerDefault;
+import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
 
 /**
  * For testing purposes, request corresponding to a {@link LogonFixture}.
  *
  * <p>
- * Understood directly by {@link AuthenticationManagerDefault}.
+ * Understood directly by {@link AuthenticationManager}.
  */
 public class AuthenticationRequestLogonFixture extends AuthenticationRequestAbstract {
 
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/manager/AuthenticationManager.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/manager/AuthenticationManager.java
index 41d337b..b66c992 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/manager/AuthenticationManager.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/manager/AuthenticationManager.java
@@ -19,27 +19,150 @@
 
 package org.apache.isis.security.api.authentication.manager;
 
+import lombok.extern.log4j.Log4j2;
+import lombok.val;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.apache.isis.applib.util.ToString;
+import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.security.api.authentication.AuthenticationRequest;
 import org.apache.isis.security.api.authentication.AuthenticationSession;
+import org.apache.isis.security.api.authentication.standard.*;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
+
+@Service
+@Named("isisSecurityApi.AuthenticationManager")
+@Order(OrderPrecedence.MIDPOINT)
+@Primary
+@Qualifier("Default")
+@Log4j2
+public class AuthenticationManager {
+
+    private final Map<String, String> userByValidationCode = _Maps.newHashMap();
+
+    private final RandomCodeGenerator randomCodeGenerator;
+    private final List<Authenticator> authenticators;
+    private final List<Registrar> registrars;
+
+    @Inject
+    public AuthenticationManager(
+            final List<Authenticator> authenticators,
+            final RandomCodeGenerator randomCodeGenerator) {
+        this.randomCodeGenerator = randomCodeGenerator;
+        this.authenticators = authenticators;
+        if (authenticators.isEmpty()) {
+            throw new NoAuthenticatorException("No authenticators specified");
+        }
+
+        registrars = authenticators.stream()
+                .filter(Registrar.class::isInstance)
+                .map(Registrar.class::cast)
+                .collect(_Lists.toUnmodifiable());
+    }
+
+    // -- SESSION MANAGEMENT (including authenticate)
+
+    public synchronized final AuthenticationSession authenticate(AuthenticationRequest request) {
+        
+        if (request == null) {
+            return null;
+        }
+
+        val compatibleAuthenticators = _NullSafe.stream(authenticators)
+                .filter(authenticator->authenticator.canAuthenticate(request.getClass()))
+                .collect(Collectors.toList());
+                
+        if (compatibleAuthenticators.size() == 0) {
+            throw new NoAuthenticatorException("No authenticator available for processing " + request.getClass().getName());
+        }
+        
+        for (final Authenticator authenticator : compatibleAuthenticators) {
+            val authSession = authenticator.authenticate(request, getUnusedRandomCode());
+            if (authSession != null) {
+                userByValidationCode.put(authSession.getValidationCode(), authSession.getUserName());
+                return authSession;
+            }
+        }
+        
+        return null;
+    }
+    
+    private String getUnusedRandomCode() {
+        String code;
+        do {
+            code = randomCodeGenerator.generateRandomCode();
+        } while (userByValidationCode.containsKey(code));
+
+        return code;
+    }
+
+
+    public final boolean isSessionValid(final AuthenticationSession session) {
+        if(session instanceof SimpleSession) {
+            final SimpleSession simpleSession = (SimpleSession) session;
+            if(simpleSession.getType() == AuthenticationSession.Type.EXTERNAL) {
+                return true;
+            }
+        }
+        final String userName = userByValidationCode.get(session.getValidationCode());
+        return session.hasUserNameOf(userName);
+    }
+
+
+    public void closeSession(AuthenticationSession session) {
+        for (Authenticator authenticator : authenticators) {
+            authenticator.logout(session);
+        }
+        userByValidationCode.remove(session.getValidationCode());
+    }
+
+    // -- AUTHENTICATORS
+
+    public boolean register(RegistrationDetails registrationDetails) {
+        for (val registrar : this.registrars) {
+            if (registrar.canRegister(registrationDetails.getClass())) {
+                return registrar.register(registrationDetails);
+            }
+        }
+        return false;
+    }
+
+
+    public boolean supportsRegistration(Class<? extends RegistrationDetails> registrationDetailsClass) {
+        for (val registrar : this.registrars) {
+            if (registrar.canRegister(registrationDetailsClass)) {
+                return true;
+            }
+        }
+        return false;
+    }
 
-public interface AuthenticationManager {
 
-    /**
-     * Caches and returns an authentication {@link AuthenticationSession} if the
-     * {@link AuthenticationRequest request} is valid; otherwise returns
-     * <tt>null</tt>.
-     */
-    AuthenticationSession authenticate(AuthenticationRequest request);
 
-    boolean supportsRegistration(Class<? extends RegistrationDetails> registrationDetailsClass);
+    // -- DEBUGGING
+ 
+    private final static ToString<AuthenticationManager> toString =
+            ToString.<AuthenticationManager>toString("class", obj->obj.getClass().getSimpleName())
+            .thenToString("authenticators", obj->""+obj.authenticators.size())
+            .thenToString("users", obj->""+obj.userByValidationCode.size());
 
-    boolean register(RegistrationDetails registrationDetails);
+    @Override
+    public String toString() {
+        return toString.toString(this);
+    }
 
-    /**
-     * Whether the provided {@link AuthenticationSession} is still valid.
-     */
-    boolean isSessionValid(AuthenticationSession authenticationSession);
 
-    void closeSession(AuthenticationSession authenticationSession);
 
 }
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerDefault.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerDefault.java
deleted file mode 100644
index 59a7f42..0000000
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticationManagerDefault.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.security.api.authentication.standard;
-
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import javax.annotation.PostConstruct;
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.applib.util.ToString;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.base._Lazy;
-import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.security.api.authentication.AuthenticationRequest;
-import org.apache.isis.security.api.authentication.AuthenticationSession;
-import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
-import org.apache.isis.security.api.authentication.manager.RegistrationDetails;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Primary;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Service;
-
-import static org.apache.isis.commons.internal.base._With.requires;
-
-import lombok.Getter;
-import lombok.extern.log4j.Log4j2;
-import lombok.val;
-
-@Service
-@Named("isisSecurityApi.AuthenticationManagerDefault")
-@Order(OrderPrecedence.MIDPOINT)
-@Primary
-@Qualifier("Default")
-@Log4j2
-public class AuthenticationManagerDefault implements AuthenticationManager {
-
-    @Inject private ServiceRegistry serviceRegistry;
-
-    private final Map<String, String> userByValidationCode = _Maps.newHashMap();
-    private final _Lazy<RandomCodeGenerator> randomCodeGenerator =
-            _Lazy.threadSafe(this::getDefaultRandomCodeGenerator);
-    
-    @Getter private RandomCodeGenerator defaultRandomCodeGenerator = new RandomCodeGenerator10Chars();
-    @Getter private Can<Authenticator> authenticators;
-
-    @PostConstruct
-    public void init() {
-        authenticators = serviceRegistry.select(Authenticator.class);
-        if (authenticators.isEmpty()) {
-            throw new NoAuthenticatorException("No authenticators specified");
-        }
-    }
-
-    // -- SESSION MANAGEMENT (including authenticate)
-
-    @Override
-    public synchronized final AuthenticationSession authenticate(AuthenticationRequest request) {
-        
-        if (request == null) {
-            return null;
-        }
-
-        val compatibleAuthenticators = _NullSafe.stream(authenticators)
-                .filter(authenticator->authenticator.canAuthenticate(request.getClass()))
-                .collect(Collectors.toList());
-                
-        if (compatibleAuthenticators.size() == 0) {
-            throw new NoAuthenticatorException("No authenticator available for processing " + request.getClass().getName());
-        }
-        
-        for (final Authenticator authenticator : compatibleAuthenticators) {
-            val authSession = authenticator.authenticate(request, getUnusedRandomCode());
-            if (authSession != null) {
-                userByValidationCode.put(authSession.getValidationCode(), authSession.getUserName());
-                return authSession;
-            }
-        }
-        
-        return null;
-    }
-    
-    private String getUnusedRandomCode() {
-        String code;
-        do {
-            code = randomCodeGenerator.get().generateRandomCode();
-        } while (userByValidationCode.containsKey(code));
-
-        return code;
-    }
-
-
-    @Override
-    public final boolean isSessionValid(final AuthenticationSession session) {
-        if(session instanceof SimpleSession) {
-            final SimpleSession simpleSession = (SimpleSession) session;
-            if(simpleSession.getType() == AuthenticationSession.Type.EXTERNAL) {
-                return true;
-            }
-        }
-        final String userName = userByValidationCode.get(session.getValidationCode());
-        return session.hasUserNameOf(userName);
-    }
-
-
-    @Override
-    public void closeSession(AuthenticationSession session) {
-        for (Authenticator authenticator : authenticators) {
-            authenticator.logout(session);
-        }
-        userByValidationCode.remove(session.getValidationCode());
-    }
-
-    // -- AUTHENTICATORS
-
-    @Override
-    public boolean register(RegistrationDetails registrationDetails) {
-        for (val registrar : getRegistrars()) {
-            if (registrar.canRegister(registrationDetails.getClass())) {
-                return registrar.register(registrationDetails);
-            }
-        }
-        return false;
-    }
-
-
-    @Override
-    public boolean supportsRegistration(Class<? extends RegistrationDetails> registrationDetailsClass) {
-        for (val registrar : getRegistrars()) {
-            if (registrar.canRegister(registrationDetailsClass)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private final _Lazy<List<Registrar>> registrars = _Lazy.threadSafe(this::toRegistrars);
-    
-    public List<Registrar> getRegistrars() {
-        return registrars.get();
-    }
-
-    private List<Registrar> toRegistrars() {
-        return getAuthenticators().stream()
-                .map(Registrar.AS_REGISTRAR_ELSE_NULL)
-                .filter(_NullSafe::isPresent)
-                .collect(_Lists.toUnmodifiable());
-    }
-
-    // -- RANDOM CODE GENERATOR
- 
-    public void setRandomCodeGenerator(RandomCodeGenerator randomCodeGenerator) {
-        requires(randomCodeGenerator, "randomCodeGenerator");
-        this.defaultRandomCodeGenerator = randomCodeGenerator;
-        this.randomCodeGenerator.clear(); // invalidate
-    }
-
-    // -- DEBUGGING
- 
-    private final static ToString<AuthenticationManagerDefault> toString =
-            ToString.<AuthenticationManagerDefault>toString("class", obj->obj.getClass().getSimpleName())
-            .thenToString("authenticators", obj->""+obj.authenticators.size())
-            .thenToString("users", obj->""+obj.userByValidationCode.size());
-
-    @Override
-    public String toString() {
-        return toString.toString(this);
-    }
-
-
-    /**
-     * JUnit Test Support
-     * @param mockAuthenticator
-     * @return
-     */
-    public static AuthenticationManagerDefault instanceForTesting(Authenticator authenticator) {
-        val manager = new AuthenticationManagerDefault();
-        manager.authenticators = Can.ofSingleton(authenticator);
-        return manager;
-    }
-
-
-}
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticatorAbstract.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticatorAbstract.java
index 999fea1..55b7ea3 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticatorAbstract.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticatorAbstract.java
@@ -29,7 +29,7 @@ public abstract class AuthenticatorAbstract implements Authenticator {
      * if required.
      */
     @Override
-    public AuthenticationSession authenticate(final AuthenticationRequest request, final String code) {
+    public final AuthenticationSession authenticate(final AuthenticationRequest request, final String code) {
         if (!isValid(request)) {
             return null;
         }
@@ -44,7 +44,7 @@ public abstract class AuthenticatorAbstract implements Authenticator {
     protected abstract boolean isValid(AuthenticationRequest request);
 
     @Override
-    public void logout(final AuthenticationSession session) {
+    public final void logout(final AuthenticationSession session) {
         // no-op
     }
 
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticatorDefault.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticatorDefault.java
deleted file mode 100644
index 4e650ce..0000000
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/AuthenticatorDefault.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.security.api.authentication.standard;
-
-public abstract class AuthenticatorDefault extends AuthenticatorAbstract {
-
-    public AuthenticatorDefault() {
-        super();
-    }
-
-}
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/PasswordRequestAuthenticatorAbstract.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/PasswordRequestAuthenticatorAbstract.java
deleted file mode 100644
index adabc79..0000000
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/PasswordRequestAuthenticatorAbstract.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.security.api.authentication.standard;
-
-import org.apache.isis.security.api.authentication.AuthenticationRequest;
-import org.apache.isis.security.api.authentication.AuthenticationRequestPassword;
-
-public abstract class PasswordRequestAuthenticatorAbstract extends AuthenticatorAbstract {
-
-    public PasswordRequestAuthenticatorAbstract() {
-        super();
-    }
-
-    @Override
-    public final boolean canAuthenticate(final Class<? extends AuthenticationRequest> authenticationRequestClass) {
-        return AuthenticationRequestPassword.class.isAssignableFrom(authenticationRequestClass);
-    }
-
-}
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RandomCodeGenerator10Chars.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RandomCodeGeneratorDefault.java
similarity index 73%
rename from core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RandomCodeGenerator10Chars.java
rename to core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RandomCodeGeneratorDefault.java
index 60e10e0..1127061 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RandomCodeGenerator10Chars.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RandomCodeGeneratorDefault.java
@@ -18,9 +18,25 @@
  */
 package org.apache.isis.security.api.authentication.standard;
 
+import lombok.extern.log4j.Log4j2;
+
 import java.util.Random;
 
-public class RandomCodeGenerator10Chars implements RandomCodeGenerator {
+import javax.inject.Named;
+
+import org.apache.isis.applib.annotation.OrderPrecedence;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+@Component
+@Named("isisSecurityApi.RandomCodeGenerator10Chars")
+@Order(OrderPrecedence.LOW)
+@Primary
+@Qualifier("Default")
+@Log4j2
+public class RandomCodeGeneratorDefault implements RandomCodeGenerator {
 
     private static final int NUMBER_CHARACTERS = 10;
     private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RandomCodeGeneratorUUID.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RandomCodeGeneratorUUID.java
deleted file mode 100644
index 2a84acf..0000000
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RandomCodeGeneratorUUID.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.security.api.authentication.standard;
-
-import java.util.UUID;
-
-public class RandomCodeGeneratorUUID implements RandomCodeGenerator {
-
-    /**
-     * Generates a random string in the form <tt>XXXX-XX-XX-XX-XXXXXX</tt> where
-     * X is a hexadecimal.
-     *
-     * <p>
-     * Implementation uses Java's own {@link UUID} class.
-     *
-     * @see UUID#toString() for details on the formatting.
-     */
-    @Override
-    public String generateRandomCode() {
-        return java.util.UUID.randomUUID().toString();
-    }
-
-}
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/Registrar.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/Registrar.java
index 9adc67f..aee8e03 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/Registrar.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/Registrar.java
@@ -26,13 +26,6 @@ import org.apache.isis.security.api.authentication.manager.RegistrationDetails;
 
 public interface Registrar extends Authenticator, ApplicationScopedComponent {
 
-    static Function<Authenticator, Registrar> AS_REGISTRAR_ELSE_NULL = (final Authenticator input) -> {
-        if (input instanceof Registrar) {
-            return (Registrar) input;
-        }
-        return null;
-    };
-
     /**
      * Whether the provided {@link RegistrationDetails} is recognized by this
      * {@link Registrar}.
diff --git a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RegistrationDetailsPassword.java b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RegistrationDetailsPassword.java
index 2eb16b6..c12533d 100644
--- a/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RegistrationDetailsPassword.java
+++ b/core/security/api/src/main/java/org/apache/isis/security/api/authentication/standard/RegistrationDetailsPassword.java
@@ -18,25 +18,15 @@
  */
 package org.apache.isis.security.api.authentication.standard;
 
+import lombok.Data;
+import lombok.Getter;
+
 import org.apache.isis.security.api.authentication.manager.RegistrationDetails;
 
+@Data
 public class RegistrationDetailsPassword implements RegistrationDetails {
 
     private final String user;
     private final String password;
 
-    public RegistrationDetailsPassword(final String user, final String password) {
-        super();
-        this.user = user;
-        this.password = password;
-    }
-
-    public String getUser() {
-        return user;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
 }
diff --git a/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java b/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java
index 200d9c0..4d6a910 100644
--- a/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java
+++ b/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticationTest.java
@@ -19,7 +19,9 @@
 
 package org.apache.isis.security.authentication.standard;
 
-import org.apache.isis.security.api.authentication.standard.AuthenticationManagerDefault;
+import java.util.Collections;
+
+import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
 import org.apache.isis.security.api.authentication.standard.Authenticator;
 import org.apache.isis.security.api.authentication.standard.RandomCodeGenerator;
 import org.hamcrest.Description;
@@ -45,7 +47,7 @@ public class StandardAuthenticationManager_AuthenticationTest {
 
     private final Mockery mockery = new JUnit4Mockery();
 
-    private AuthenticationManagerDefault authenticationManager;
+    private AuthenticationManager authenticationManager;
 
     private RandomCodeGenerator mockRandomCodeGenerator;
     private Authenticator mockAuthenticator;
@@ -57,8 +59,7 @@ public class StandardAuthenticationManager_AuthenticationTest {
         mockAuthenticator = mockery.mock(Authenticator.class);
         mockAuthSession = mockery.mock(AuthenticationSession.class);
 
-        authenticationManager = AuthenticationManagerDefault.instanceForTesting(mockAuthenticator);
-        authenticationManager.setRandomCodeGenerator(mockRandomCodeGenerator);
+        authenticationManager = new AuthenticationManager(Collections.singletonList(mockAuthenticator), mockRandomCodeGenerator);
 
         mockery.checking(new Expectations() {
             {
diff --git a/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticatorsTest.java b/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticatorsTest.java
index b11a1a2..2912f7d 100644
--- a/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticatorsTest.java
+++ b/core/security/api/src/test/java/org/apache/isis/security/authentication/standard/StandardAuthenticationManager_AuthenticatorsTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.isis.security.authentication.standard;
 
-import org.apache.isis.security.api.authentication.standard.AuthenticationManagerDefault;
+import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
 import org.apache.isis.security.api.authentication.standard.Authenticator;
 import org.apache.isis.security.api.authentication.standard.NoAuthenticatorException;
 import org.jmock.Mockery;
@@ -39,7 +39,7 @@ public class StandardAuthenticationManager_AuthenticatorsTest {
 
     private final Mockery mockery = new JUnit4Mockery();
 
-    private AuthenticationManagerDefault authenticationManager;
+    private AuthenticationManager authenticationManager;
     private Authenticator mockAuthenticator;
 
     @Before
@@ -56,7 +56,7 @@ public class StandardAuthenticationManager_AuthenticatorsTest {
     @Test(expected = NoAuthenticatorException.class)
     public void shouldNotBeAbleToAuthenticateWithNoAuthenticators() throws Exception {
         
-        authenticationManager = new AuthenticationManagerDefault();
+        authenticationManager = new AuthenticationManager(authenticators, randomCodeGenerator);
         
         authenticationManager.authenticate(new AuthenticationRequestPassword("foo", "bar"));
     }
@@ -64,7 +64,7 @@ public class StandardAuthenticationManager_AuthenticatorsTest {
     @Test
     public void shouldBeAbleToUseAuthenticators() throws Exception {
         
-        authenticationManager = AuthenticationManagerDefault.instanceForTesting(mockAuthenticator);
+        authenticationManager = AuthenticationManager.instanceForTesting(mockAuthenticator);
         
         assertThat(authenticationManager.getAuthenticators().size(), is(1));
         assertThat(authenticationManager.getAuthenticators().getFirst().get(), is(sameInstance(mockAuthenticator)));
diff --git a/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/IsisModuleSecurityKeycloak.java b/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/IsisModuleSecurityKeycloak.java
index 4610c5c..f29c06a 100644
--- a/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/IsisModuleSecurityKeycloak.java
+++ b/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/IsisModuleSecurityKeycloak.java
@@ -21,8 +21,7 @@ package org.apache.isis.security.keycloak;
 import javax.inject.Singleton;
 
 import org.apache.isis.runtime.services.IsisModuleRuntimeServices;
-import org.apache.isis.security.api.IsisModuleSecurityApi;
-import org.apache.isis.security.keycloak.authentication.KeycloakAuthenticator;
+import org.apache.isis.security.keycloak.authentication.AuthenticatorKeycloak;
 import org.apache.isis.security.keycloak.authorization.KeycloakAuthorizor;
 import org.apache.isis.security.keycloak.webmodule.WebModuleKeycloak;
 import org.apache.isis.webapp.IsisModuleWebapp;
@@ -30,7 +29,6 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
-import org.apache.isis.security.api.authentication.standard.Authenticator;
 import org.apache.isis.security.api.authorization.standard.Authorizor;
 
 /**
@@ -45,17 +43,13 @@ import org.apache.isis.security.api.authorization.standard.Authorizor;
         IsisModuleWebapp.class,
 
         // @Service's
+        AuthenticatorKeycloak.class,
         WebModuleKeycloak.class,
 
 })
 public class IsisModuleSecurityKeycloak {
 
     @Bean @Singleton
-    public Authenticator authenticator() {
-        return new KeycloakAuthenticator();
-    }
-
-    @Bean @Singleton
     public Authorizor autorizor() {
         return new KeycloakAuthorizor();
     }
diff --git a/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/authentication/KeycloakAuthenticator.java b/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/authentication/AuthenticatorKeycloak.java
similarity index 77%
rename from core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/authentication/KeycloakAuthenticator.java
rename to core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/authentication/AuthenticatorKeycloak.java
index 8192a06..99573df 100644
--- a/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/authentication/KeycloakAuthenticator.java
+++ b/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/authentication/AuthenticatorKeycloak.java
@@ -18,34 +18,33 @@
  */
 package org.apache.isis.security.keycloak.authentication;
 
-import lombok.NoArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 
 import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.security.api.authentication.AuthenticationRequest;
 import org.apache.isis.security.api.authentication.AuthenticationSession;
 import org.apache.isis.security.api.authentication.standard.Authenticator;
 import org.apache.isis.webapp.wormhole.AuthenticationSessionWormhole;
-
-@Log4j2 @NoArgsConstructor
-public class KeycloakAuthenticator implements Authenticator {
-
-    @Inject private IsisConfiguration configuration;
-
-
-    // -- init, shutdown
-
-    public void init() {
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
+
+@Service
+@Named("isisSecurityKeycloak.AuthenticatorKeycloak")
+@Order(OrderPrecedence.HIGH)
+@Qualifier("Keycloak")
+@Singleton
+@Log4j2
+public class AuthenticatorKeycloak implements Authenticator {
+
+    public AuthenticatorKeycloak() {
     }
 
-
-    public void shutdown() {
-    }
-
-    // -- Authenticator API
-
     @Override
     public final boolean canAuthenticate(final Class<? extends AuthenticationRequest> authenticationRequestClass) {
         return true;
@@ -60,5 +59,4 @@ public class KeycloakAuthenticator implements Authenticator {
     public void logout(final AuthenticationSession session) {
     }
 
-
 }
diff --git a/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java b/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java
index 1022d35..dbec699 100644
--- a/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java
+++ b/core/security/keycloak/src/main/java/org/apache/isis/security/keycloak/webmodule/WebModuleKeycloak.java
@@ -42,7 +42,7 @@ import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpected
  * WebModule to enable support for Keycloak.
  */
 @Service
-@Named("isisSecKeycloak.WebModuleKeycloak")
+@Named("isisSecurityKeycloak.WebModuleKeycloak")
 @Order(OrderPrecedence.HIGHEST + 100)
 @Qualifier("Keycloak")
 @Log4j2
diff --git a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/IsisModuleSecurityShiro.java b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/IsisModuleSecurityShiro.java
index 49927a1..fd9df93 100644
--- a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/IsisModuleSecurityShiro.java
+++ b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/IsisModuleSecurityShiro.java
@@ -21,7 +21,6 @@ package org.apache.isis.security.shiro;
 import javax.inject.Singleton;
 
 import org.apache.isis.runtime.services.IsisModuleRuntimeServices;
-import org.apache.isis.security.api.IsisModuleSecurityApi;
 import org.apache.isis.security.shiro.webmodule.WebModuleShiro;
 import org.apache.isis.webapp.IsisModuleWebapp;
 import org.springframework.context.annotation.Bean;
@@ -30,7 +29,7 @@ import org.springframework.context.annotation.Import;
 
 import org.apache.isis.security.api.authentication.standard.Authenticator;
 import org.apache.isis.security.api.authorization.standard.Authorizor;
-import org.apache.isis.security.shiro.authentication.ShiroAuthenticator;
+import org.apache.isis.security.shiro.authentication.AuthenticatorShiro;
 import org.apache.isis.security.shiro.authorization.ShiroAuthorizor;
 
 /**
@@ -45,17 +44,13 @@ import org.apache.isis.security.shiro.authorization.ShiroAuthorizor;
         IsisModuleWebapp.class,
 
         // @Service's
+        AuthenticatorShiro.class,
         WebModuleShiro.class,
 
 })
 public class IsisModuleSecurityShiro {
 
     @Bean @Singleton
-    public Authenticator authenticator() {
-        return new ShiroAuthenticator();
-    }
-
-    @Bean @Singleton
     public Authorizor autorizor() {
         return new ShiroAuthorizor();
     }
diff --git a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/authentication/ShiroAuthenticator.java b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/authentication/AuthenticatorShiro.java
similarity index 91%
rename from core/security/shiro/src/main/java/org/apache/isis/security/shiro/authentication/ShiroAuthenticator.java
rename to core/security/shiro/src/main/java/org/apache/isis/security/shiro/authentication/AuthenticatorShiro.java
index 94a63fe..c025f87 100644
--- a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/authentication/ShiroAuthenticator.java
+++ b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/authentication/AuthenticatorShiro.java
@@ -25,7 +25,9 @@ import java.util.stream.Stream;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
+import javax.inject.Named;
 
+import org.apache.isis.applib.annotation.OrderPrecedence;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authc.AuthenticationInfo;
@@ -52,40 +54,41 @@ import org.apache.isis.security.api.authentication.standard.Authenticator;
 import org.apache.isis.security.api.authentication.standard.SimpleSession;
 import org.apache.isis.security.api.authorization.standard.Authorizor;
 import org.apache.isis.security.shiro.context.ShiroSecurityContext;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Service;
 
 import lombok.NoArgsConstructor;
 import lombok.extern.log4j.Log4j2;
 
 /**
- * If Shiro is configured for both {@link AuthenticationManagerInstaller authentication} and
- * {@link AuthorizationManagerInstaller authorization} (as recommended), then this class is
+ * If Shiro is configured for both authentication and authorization (as recommended), then this class is
  * in the role of {@link Authenticator}.
  *
  * <p>
  * However, although there are two objects, they are set up to share the same 
  * {@link SecurityManager Shiro SecurityManager}
  * (bound to a thread-local).
+ * </p>
  */
-@Log4j2 @NoArgsConstructor
-public class ShiroAuthenticator implements Authenticator {
-
-    @Inject private IsisConfiguration configuration;
-
-    private boolean autoLogout;
-
-    // -- LIFECYCLE
-
-    @PostConstruct
-    public void init() {
-        autoLogout = configuration.getAuthentication().getShiro().isAutoLogoutIfAlreadyAuthenticated();
+@Service
+@Named("isisSecurityShiro.AuthenticatorShiro")
+@Order(OrderPrecedence.HIGH)
+@Qualifier("Keycloak")
+@Log4j2
+public class AuthenticatorShiro implements Authenticator {
+
+    private final IsisConfiguration configuration;
+    private final boolean autoLogout;
+
+    @Inject
+    public AuthenticatorShiro(IsisConfiguration configuration) {
+        super();
+        this.configuration = configuration;
+        this.autoLogout = this.configuration.getAuthentication().getShiro().isAutoLogoutIfAlreadyAuthenticated();
     }
 
 
-//    @Override
-//    public void shutdown() {
-//    }
-
-    // -- Authenticator API
 
     @Override
     public final boolean canAuthenticate(final Class<? extends AuthenticationRequest> authenticationRequestClass) {
@@ -224,11 +227,4 @@ public class ShiroAuthenticator implements Authenticator {
         return ShiroSecurityContext.getSecurityManager();
     }
 
-    /** Junit support */
-    public ShiroAuthenticator(IsisConfiguration configuration) {
-        super();
-        this.configuration = configuration;
-    }
-
-
 }
diff --git a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
index 610820d..ec9f052 100644
--- a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
+++ b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/webmodule/WebModuleShiro.java
@@ -63,7 +63,7 @@ import lombok.val;
  * @since 2.0
  */
 @Service
-@Named("isisSecKeycloak.WebModuleKeycloak")
+@Named("isisSecurityKeycloak.WebModuleKeycloak")
 @Order(OrderPrecedence.HIGHEST + 200)
 @Qualifier("Shiro")
 @Log4j2
diff --git a/core/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_authenticate.java b/core/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_authenticate.java
index 451a948..96fbf1d 100644
--- a/core/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_authenticate.java
+++ b/core/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_authenticate.java
@@ -34,7 +34,7 @@ import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.security.api.authentication.AuthenticationRequest;
 import org.apache.isis.security.api.authentication.AuthenticationRequestPassword;
 import org.apache.isis.security.api.authentication.AuthenticationSession;
-import org.apache.isis.security.shiro.authentication.ShiroAuthenticator;
+import org.apache.isis.security.shiro.authentication.AuthenticatorShiro;
 import org.apache.isis.security.shiro.authorization.ShiroAuthorizor;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
@@ -51,7 +51,7 @@ public class ShiroAuthenticatorOrAuthorizorTest_authenticate {
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
-    private ShiroAuthenticator authenticator;
+    private AuthenticatorShiro authenticator;
     private ShiroAuthorizor authorizor;
 
     @Before
@@ -62,7 +62,7 @@ public class ShiroAuthenticatorOrAuthorizorTest_authenticate {
         val configuration = new IsisConfiguration();
         configuration.getAuthentication().getShiro().setAutoLogoutIfAlreadyAuthenticated(false);
         
-        authenticator = new ShiroAuthenticator(configuration);
+        authenticator = new AuthenticatorShiro(configuration);
         authorizor = new ShiroAuthorizor();
 
         authenticator.init();
diff --git a/core/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole.java b/core/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole.java
index 87b9266..73da9c1 100644
--- a/core/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole.java
+++ b/core/security/shiro/src/test/java/org/apache/isis/security/shiro/ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole.java
@@ -34,7 +34,7 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.security.api.authentication.AuthenticationRequest;
 import org.apache.isis.security.api.authentication.AuthenticationRequestPassword;
-import org.apache.isis.security.shiro.authentication.ShiroAuthenticator;
+import org.apache.isis.security.shiro.authentication.AuthenticatorShiro;
 import org.apache.isis.security.shiro.authorization.ShiroAuthorizor;
 import org.apache.isis.unittestsupport.config.IsisConfigurationLegacy;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
@@ -53,7 +53,7 @@ public class ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole {
     @Mock
     private IsisConfigurationLegacy mockConfiguration;
 
-    private ShiroAuthenticator authenticator;
+    private AuthenticatorShiro authenticator;
     private ShiroAuthorizor authorizor;
 
     @Before
@@ -64,7 +64,7 @@ public class ShiroAuthenticatorOrAuthorizorTest_isVisibleInAnyRole {
         val configuration = new IsisConfiguration();
         configuration.getAuthentication().getShiro().setAutoLogoutIfAlreadyAuthenticated(false);
         
-        authenticator = new ShiroAuthenticator(configuration);
+        authenticator = new AuthenticatorShiro(configuration);
         authorizor = new ShiroAuthorizor();
 
         authenticator.init();
diff --git a/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/components/AuthenticationManagerNull.java b/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/components/AuthenticationManagerNull.java
deleted file mode 100644
index 9b684b9..0000000
--- a/core/testsupport/integtestsupport/src/main/java/org/apache/isis/integtestsupport/components/AuthenticationManagerNull.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.integtestsupport.components;
-
-import org.apache.isis.commons.internal.components.Noop;
-import org.apache.isis.security.api.authentication.AuthenticationRequest;
-import org.apache.isis.security.api.authentication.AuthenticationSession;
-import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
-import org.apache.isis.security.api.authentication.manager.RegistrationDetails;
-
-public class AuthenticationManagerNull implements AuthenticationManager, Noop {
-
-    @Override
-    public AuthenticationSession authenticate(final AuthenticationRequest request) {
-        return null;
-    }
-
-    @Override
-    public void closeSession(final AuthenticationSession session) {
-    }
-
-    @Override
-    public boolean isSessionValid(final AuthenticationSession session) {
-        return false;
-    }
-
-    public void testSetSession(final AuthenticationSession authenticationSession) {
-    }
-
-    @Override
-    public boolean register(final RegistrationDetails registrationDetails) {
-        return false;
-    }
-
-    @Override
-    public boolean supportsRegistration(final Class<? extends RegistrationDetails> registrationDetailsClass) {
-        return false;
-    }
-
-}