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

lgoldstein pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-sshd.git

commit c6366e38302f4fe74c51dff605356e860f4ca80e
Author: Lyor Goldstein <lgoldst...@apache.org>
AuthorDate: Tue Aug 6 19:51:44 2019 +0300

    [SSHD-937] Provide session instance to UserAuthFactory creator method
---
 CHANGES.md                                         |  7 ++--
 .../java/org/apache/sshd/common/NamedResource.java |  9 +++--
 .../apache/sshd/common/auth/UserAuthInstance.java  |  6 ++--
 .../common/config/FactoriesListParseResult.java    |  3 +-
 .../config/NamedFactoriesListParseResult.java      |  2 +-
 .../sshd/client/ClientAuthenticationManager.java   | 24 +++++++------
 .../java/org/apache/sshd/client/SshClient.java     | 15 ++++----
 .../sshd/client/auth/AbstractUserAuthFactory.java  |  5 ++-
 .../apache/sshd/client/auth/UserAuthFactory.java   |  3 +-
 .../auth/hostbased/UserAuthHostBasedFactory.java   |  4 ++-
 .../UserAuthKeyboardInteractiveFactory.java        |  5 ++-
 .../auth/password/UserAuthPasswordFactory.java     |  5 ++-
 .../auth/pubkey/UserAuthPublicKeyFactory.java      |  4 ++-
 .../sshd/client/session/AbstractClientSession.java | 11 +++---
 .../sshd/client/session/ClientUserAuthService.java | 11 +++---
 .../common/auth/AbstractUserAuthMethodFactory.java |  6 +++-
 .../sshd/common/auth/UserAuthMethodFactory.java    | 41 +++++++++++++++++++---
 .../sshd/common/kex/AbstractKexFactoryManager.java | 13 ++++---
 .../sshd/server/ServerAuthenticationManager.java   | 18 +++++-----
 .../java/org/apache/sshd/server/SshServer.java     | 11 +++---
 .../sshd/server/auth/AbstractUserAuthFactory.java  |  5 ++-
 .../apache/sshd/server/auth/UserAuthFactory.java   |  3 +-
 .../sshd/server/auth/UserAuthNoneFactory.java      |  6 +++-
 .../sshd/server/auth/gss/UserAuthGSSFactory.java   |  5 ++-
 .../auth/hostbased/UserAuthHostBasedFactory.java   |  4 ++-
 .../UserAuthKeyboardInteractiveFactory.java        |  5 ++-
 .../auth/password/UserAuthPasswordFactory.java     |  5 ++-
 .../auth/pubkey/UserAuthPublicKeyFactory.java      |  4 ++-
 .../sshd/server/session/AbstractServerSession.java | 11 +++---
 .../sshd/server/session/ServerUserAuthService.java | 17 ++++-----
 .../client/ClientAuthenticationManagerTest.java    | 14 ++++----
 .../java/org/apache/sshd/client/ClientTest.java    |  2 +-
 .../sshd/common/auth/AuthenticationTest.java       |  6 ++--
 .../server/ServerAuthenticationManagerTest.java    | 14 ++++----
 34 files changed, 191 insertions(+), 113 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 68722a2..57d62a7 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -18,10 +18,13 @@ session is initiated and protect their instance from 
shutdown when session is de
     server.setSubsystemFactories(Collections.singletonList(factory));
 ```
 
-* `SubsystemFactory` is  a proper interface and it has been refactored to 
contain a
+* `SubsystemFactory` is a proper interface and it has been refactored to 
contain a
 `createSubsystem` method that accepts the `ChannelSession` through which the 
request
 has been made
 
+* `UserAuthFactory` is a proper interface and it has been refactored to 
contain a
+`createUserAuth` method that accepts the session instance through which the 
request is made.
+
 ## Minor code helpers
 
 * `SessionListener` supports `sessionPeerIdentificationReceived` that is 
invoked once successful
@@ -36,4 +39,4 @@ for the server's identification before sending its own.
 
 * [SSHD-934](https://issues.apache.org/jira/browse/SSHD-934) - Fixed ECDSA 
public key encoding into OpenSSH format.
 
-* [SSHD-937](https://issues.apache.org/jira/browse/SSHD-937) - Provide 
ChannelSession instance when creating a subsystem instance.
\ No newline at end of file
+* [SSHD-937](https://issues.apache.org/jira/browse/SSHD-937) - Provide session 
instance when creating a subsystem or user authentication.
\ No newline at end of file
diff --git 
a/sshd-common/src/main/java/org/apache/sshd/common/NamedResource.java 
b/sshd-common/src/main/java/org/apache/sshd/common/NamedResource.java
index 048d23f..c2299f1 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/NamedResource.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/NamedResource.java
@@ -41,7 +41,8 @@ public interface NamedResource {
      * Compares 2 {@link NamedResource}s according to their {@link #getName()}
      * value case <U>insensitive</U>
      */
-    Comparator<NamedResource> BY_NAME_COMPARATOR = 
Comparator.comparing(NAME_EXTRACTOR, String.CASE_INSENSITIVE_ORDER);
+    Comparator<NamedResource> BY_NAME_COMPARATOR =
+        Comparator.comparing(NAME_EXTRACTOR, String.CASE_INSENSITIVE_ORDER);
 
     /**
      * @return The resource name
@@ -76,7 +77,8 @@ public interface NamedResource {
      * @param resources The {@link NamedResource} to check - ignored if {@code 
null}/empty
      * @return the removed resource from the list or {@code null} if not in 
the list
      */
-    static <R extends NamedResource> R removeByName(String name, Comparator<? 
super String> c, Collection<? extends R> resources) {
+    static <R extends NamedResource> R removeByName(
+            String name, Comparator<? super String> c, Collection<? extends R> 
resources) {
         R r = findByName(name, c, resources);
         if (r != null) {
             resources.remove(r);
@@ -93,7 +95,8 @@ public interface NamedResource {
      * @return The <U>first</U> resource whose name matches the parameter (by 
invoking
      * {@link Comparator#compare(Object, Object)} - {@code null} if no match 
found
      */
-    static <R extends NamedResource> R findByName(String name, Comparator<? 
super String> c, Collection<? extends R> resources) {
+    static <R extends NamedResource> R findByName(
+            String name, Comparator<? super String> c, Collection<? extends R> 
resources) {
         return GenericUtils.isEmpty(name)
             ? null
             : GenericUtils.stream(resources)
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java 
b/sshd-common/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java
similarity index 89%
rename from 
sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java
rename to 
sshd-common/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java
index f7448e6..7e326ee 100644
--- a/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java
+++ 
b/sshd-common/src/main/java/org/apache/sshd/common/auth/UserAuthInstance.java
@@ -20,7 +20,7 @@
 package org.apache.sshd.common.auth;
 
 import org.apache.sshd.common.NamedResource;
-import org.apache.sshd.common.session.Session;
+import org.apache.sshd.common.session.SessionContext;
 
 /**
  * Represents an authentication-in-progress tracker for a specific session
@@ -28,8 +28,7 @@ import org.apache.sshd.common.session.Session;
  * @param <S> The type of session being tracked by the instance
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-//CHECKSTYLE:OFF
-public interface UserAuthInstance<S extends Session> extends NamedResource {
+public interface UserAuthInstance<S extends SessionContext> extends 
NamedResource {
     /**
      * @return The current session for which the authentication is being
      * tracked. <B>Note:</B> may be {@code null} if the instance has not
@@ -37,4 +36,3 @@ public interface UserAuthInstance<S extends Session> extends 
NamedResource {
      */
     S getSession();
 }
-//CHECKSTYLE:ON
diff --git 
a/sshd-common/src/main/java/org/apache/sshd/common/config/FactoriesListParseResult.java
 
b/sshd-common/src/main/java/org/apache/sshd/common/config/FactoriesListParseResult.java
index 7a1cee1..ea529c1 100644
--- 
a/sshd-common/src/main/java/org/apache/sshd/common/config/FactoriesListParseResult.java
+++ 
b/sshd-common/src/main/java/org/apache/sshd/common/config/FactoriesListParseResult.java
@@ -22,13 +22,14 @@ package org.apache.sshd.common.config;
 import java.util.List;
 
 import org.apache.sshd.common.Factory;
+import org.apache.sshd.common.NamedResource;
 
 /**
  * @param <T> Result type
  * @param <F> Factory type
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-public abstract class FactoriesListParseResult<T, F extends Factory<T>> 
extends ListParseResult<F> {
+public abstract class FactoriesListParseResult<T, F extends NamedResource> 
extends ListParseResult<F> {
     protected FactoriesListParseResult(List<F> parsed, List<String> 
unsupported) {
         super(parsed, unsupported);
     }
diff --git 
a/sshd-common/src/main/java/org/apache/sshd/common/config/NamedFactoriesListParseResult.java
 
b/sshd-common/src/main/java/org/apache/sshd/common/config/NamedFactoriesListParseResult.java
index 246cae0..0ca8072 100644
--- 
a/sshd-common/src/main/java/org/apache/sshd/common/config/NamedFactoriesListParseResult.java
+++ 
b/sshd-common/src/main/java/org/apache/sshd/common/config/NamedFactoriesListParseResult.java
@@ -32,7 +32,7 @@ import org.apache.sshd.common.util.GenericUtils;
  * @param <F> Factory type
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-public abstract class NamedFactoriesListParseResult<T, F extends 
NamedFactory<T>>
+public abstract class NamedFactoriesListParseResult<T, F extends NamedResource>
         extends FactoriesListParseResult<T, F> {
 
     protected NamedFactoriesListParseResult(List<F> parsed, List<String> 
unsupported) {
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
 
b/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
index 4b84752..b1fedc0 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/client/ClientAuthenticationManager.java
@@ -27,11 +27,10 @@ import java.util.List;
 
 import org.apache.sshd.client.auth.AuthenticationIdentitiesProvider;
 import org.apache.sshd.client.auth.BuiltinUserAuthFactories;
-import org.apache.sshd.client.auth.UserAuth;
+import org.apache.sshd.client.auth.UserAuthFactory;
 import org.apache.sshd.client.auth.keyboard.UserInteraction;
 import org.apache.sshd.client.auth.password.PasswordIdentityProvider;
 import org.apache.sshd.client.keyverifier.ServerKeyVerifier;
-import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.NamedResource;
 import org.apache.sshd.common.keyprovider.KeyIdentityProviderHolder;
 import org.apache.sshd.common.util.GenericUtils;
@@ -130,10 +129,10 @@ public interface ClientAuthenticationManager extends 
KeyIdentityProviderHolder {
     void setUserInteraction(UserInteraction userInteraction);
 
     /**
-     * @return a {@link List} of {@link UserAuth} {@link NamedFactory}-ies - 
never
+     * @return a {@link List} of {@link UserAuthFactory}-ies - never
      * {@code null}/empty
      */
-    List<NamedFactory<UserAuth>> getUserAuthFactories();
+    List<UserAuthFactory> getUserAuthFactories();
 
     default String getUserAuthFactoriesNameList() {
         return NamedResource.getNames(getUserAuthFactories());
@@ -143,23 +142,26 @@ public interface ClientAuthenticationManager extends 
KeyIdentityProviderHolder {
         return NamedResource.getNameList(getUserAuthFactories());
     }
 
-    void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories);
+    void setUserAuthFactories(List<UserAuthFactory> userAuthFactories);
 
     default void setUserAuthFactoriesNameList(String names) {
         setUserAuthFactoriesNames(GenericUtils.split(names, ','));
     }
 
     default void setUserAuthFactoriesNames(String... names) {
-        setUserAuthFactoriesNames(GenericUtils.isEmpty((Object[]) names) ? 
Collections.emptyList() : Arrays.asList(names));
+        setUserAuthFactoriesNames(
+            GenericUtils.isEmpty((Object[]) names) ? Collections.emptyList() : 
Arrays.asList(names));
     }
 
     default void setUserAuthFactoriesNames(Collection<String> names) {
-        BuiltinUserAuthFactories.ParseResult result = 
BuiltinUserAuthFactories.parseFactoriesList(names);
-        @SuppressWarnings({ "rawtypes", "unchecked" })
-        List<NamedFactory<UserAuth>> factories =
-                (List) 
ValidateUtils.checkNotNullAndNotEmpty(result.getParsedFactories(), "No 
supported cipher factories: %s", names);
+        BuiltinUserAuthFactories.ParseResult result =
+            BuiltinUserAuthFactories.parseFactoriesList(names);
+        List<UserAuthFactory> factories =
+            ValidateUtils.checkNotNullAndNotEmpty(
+                result.getParsedFactories(), "No supported cipher factories: 
%s", names);
         Collection<String> unsupported = result.getUnsupportedFactories();
-        ValidateUtils.checkTrue(GenericUtils.isEmpty(unsupported), 
"Unsupported cipher factories found: %s", unsupported);
+        ValidateUtils.checkTrue(
+            GenericUtils.isEmpty(unsupported), "Unsupported cipher factories 
found: %s", unsupported);
         setUserAuthFactories(factories);
     }
 }
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java 
b/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
index 4515b32..300ec3f 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java
@@ -40,7 +40,7 @@ import java.util.stream.Collectors;
 
 import org.apache.sshd.agent.SshAgentFactory;
 import org.apache.sshd.client.auth.AuthenticationIdentitiesProvider;
-import org.apache.sshd.client.auth.UserAuth;
+import org.apache.sshd.client.auth.UserAuthFactory;
 import org.apache.sshd.client.auth.keyboard.UserAuthKeyboardInteractiveFactory;
 import org.apache.sshd.client.auth.keyboard.UserInteraction;
 import org.apache.sshd.client.auth.password.PasswordIdentityProvider;
@@ -155,9 +155,9 @@ public class SshClient extends AbstractFactoryManager 
implements ClientFactoryMa
      * Default user authentication preferences if not set
      * @see <A HREF="http://linux.die.net/man/5/ssh_config";>ssh_config(5) - 
PreferredAuthentications</A>
      */
-    public static final List<NamedFactory<UserAuth>> 
DEFAULT_USER_AUTH_FACTORIES =
+    public static final List<UserAuthFactory> DEFAULT_USER_AUTH_FACTORIES =
         Collections.unmodifiableList(
-            Arrays.<NamedFactory<UserAuth>>asList(
+            Arrays.asList(
                 UserAuthPublicKeyFactory.INSTANCE,
                 UserAuthKeyboardInteractiveFactory.INSTANCE,
                 UserAuthPasswordFactory.INSTANCE
@@ -172,7 +172,7 @@ public class SshClient extends AbstractFactoryManager 
implements ClientFactoryMa
     protected IoConnector connector;
     protected SessionFactory sessionFactory;
     protected UserInteraction userInteraction;
-    protected List<NamedFactory<UserAuth>> userAuthFactories;
+    protected List<UserAuthFactory> userAuthFactories;
 
     private ClientProxyConnector proxyConnector;
     private ServerKeyVerifier serverKeyVerifier;
@@ -259,13 +259,14 @@ public class SshClient extends AbstractFactoryManager 
implements ClientFactoryMa
     }
 
     @Override
-    public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+    public List<UserAuthFactory> getUserAuthFactories() {
         return userAuthFactories;
     }
 
     @Override
-    public void setUserAuthFactories(List<NamedFactory<UserAuth>> 
userAuthFactories) {
-        this.userAuthFactories = 
ValidateUtils.checkNotNullAndNotEmpty(userAuthFactories, "No user auth 
factories");
+    public void setUserAuthFactories(List<UserAuthFactory> userAuthFactories) {
+        this.userAuthFactories =
+            ValidateUtils.checkNotNullAndNotEmpty(userAuthFactories, "No user 
auth factories");
     }
 
     @Override
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuthFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuthFactory.java
index 3c8f74d..e609ccd 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuthFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/AbstractUserAuthFactory.java
@@ -19,12 +19,15 @@
 
 package org.apache.sshd.client.auth;
 
+import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.common.auth.AbstractUserAuthMethodFactory;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-public abstract class AbstractUserAuthFactory extends 
AbstractUserAuthMethodFactory<UserAuth> implements UserAuthFactory {
+public abstract class AbstractUserAuthFactory
+        extends AbstractUserAuthMethodFactory<ClientSession, UserAuth>
+        implements UserAuthFactory {
     protected AbstractUserAuthFactory(String name) {
         super(name);
     }
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/UserAuthFactory.java 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/UserAuthFactory.java
index af77bb5..31426b1 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/auth/UserAuthFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/UserAuthFactory.java
@@ -18,13 +18,14 @@
  */
 package org.apache.sshd.client.auth;
 
+import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.common.auth.UserAuthMethodFactory;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 // CHECKSTYLE:OFF
-public interface UserAuthFactory extends UserAuthMethodFactory<UserAuth> {
+public interface UserAuthFactory extends UserAuthMethodFactory<ClientSession, 
UserAuth> {
     // nothing extra
 }
 //CHECKSTYLE:ON
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/hostbased/UserAuthHostBasedFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/hostbased/UserAuthHostBasedFactory.java
index 1329d5a..de00c8c 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/hostbased/UserAuthHostBasedFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/hostbased/UserAuthHostBasedFactory.java
@@ -19,9 +19,11 @@
 
 package org.apache.sshd.client.auth.hostbased;
 
+import java.io.IOException;
 import java.util.List;
 
 import org.apache.sshd.client.auth.AbstractUserAuthFactory;
+import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.signature.Signature;
 import org.apache.sshd.common.signature.SignatureFactoriesManager;
@@ -126,7 +128,7 @@ public class UserAuthHostBasedFactory extends 
AbstractUserAuthFactory implements
     }
 
     @Override
-    public UserAuthHostBased create() {
+    public UserAuthHostBased createUserAuth(ClientSession session) throws 
IOException {
         UserAuthHostBased auth = new UserAuthHostBased(getClientHostKeys());
         auth.setClientHostname(getClientHostname());
         auth.setClientUsername(getClientUsername());
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
index 86bf005..eea5c65 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
@@ -18,7 +18,10 @@
  */
 package org.apache.sshd.client.auth.keyboard;
 
+import java.io.IOException;
+
 import org.apache.sshd.client.auth.AbstractUserAuthFactory;
+import org.apache.sshd.client.session.ClientSession;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
@@ -32,7 +35,7 @@ public class UserAuthKeyboardInteractiveFactory extends 
AbstractUserAuthFactory
     }
 
     @Override
-    public UserAuthKeyboardInteractive create() {
+    public UserAuthKeyboardInteractive createUserAuth(ClientSession session) 
throws IOException {
         return new UserAuthKeyboardInteractive();
     }
 }
\ No newline at end of file
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPasswordFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPasswordFactory.java
index b52206c..ffc9b49 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPasswordFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/password/UserAuthPasswordFactory.java
@@ -18,7 +18,10 @@
  */
 package org.apache.sshd.client.auth.password;
 
+import java.io.IOException;
+
 import org.apache.sshd.client.auth.AbstractUserAuthFactory;
+import org.apache.sshd.client.session.ClientSession;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
@@ -32,7 +35,7 @@ public class UserAuthPasswordFactory extends 
AbstractUserAuthFactory {
     }
 
     @Override
-    public UserAuthPassword create() {
+    public UserAuthPassword createUserAuth(ClientSession session) throws 
IOException {
         return new UserAuthPassword();
     }
 }
\ No newline at end of file
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyFactory.java
index 176df0a..de74667 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyFactory.java
@@ -18,9 +18,11 @@
  */
 package org.apache.sshd.client.auth.pubkey;
 
+import java.io.IOException;
 import java.util.List;
 
 import org.apache.sshd.client.auth.AbstractUserAuthFactory;
+import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.signature.Signature;
 import org.apache.sshd.common.signature.SignatureFactoriesManager;
@@ -67,7 +69,7 @@ public class UserAuthPublicKeyFactory extends 
AbstractUserAuthFactory implements
     }
 
     @Override
-    public UserAuthPublicKey create() {
+    public UserAuthPublicKey createUserAuth(ClientSession session) throws 
IOException {
         return new UserAuthPublicKey(getSignatureFactories());
     }
 }
\ No newline at end of file
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
 
b/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
index 1d865aa..91bac20 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/client/session/AbstractClientSession.java
@@ -31,7 +31,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.apache.sshd.client.ClientFactoryManager;
 import org.apache.sshd.client.auth.AuthenticationIdentitiesProvider;
-import org.apache.sshd.client.auth.UserAuth;
+import org.apache.sshd.client.auth.UserAuthFactory;
 import org.apache.sshd.client.auth.keyboard.UserInteraction;
 import org.apache.sshd.client.auth.password.PasswordIdentityProvider;
 import org.apache.sshd.client.channel.ChannelDirectTcpip;
@@ -42,7 +42,6 @@ import org.apache.sshd.client.channel.ClientChannel;
 import org.apache.sshd.client.keyverifier.ServerKeyVerifier;
 import org.apache.sshd.common.AttributeRepository;
 import org.apache.sshd.common.FactoryManager;
-import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.NamedResource;
 import org.apache.sshd.common.PropertyResolverUtils;
 import org.apache.sshd.common.RuntimeSshException;
@@ -89,7 +88,7 @@ public abstract class AbstractClientSession extends 
AbstractSession implements C
     private UserInteraction userInteraction;
     private PasswordIdentityProvider passwordIdentityProvider;
     private KeyIdentityProvider keyIdentityProvider;
-    private List<NamedFactory<UserAuth>> userAuthFactories;
+    private List<UserAuthFactory> userAuthFactories;
     private SocketAddress connectAddress;
     private ClientProxyConnector proxyConnector;
 
@@ -145,13 +144,13 @@ public abstract class AbstractClientSession extends 
AbstractSession implements C
     }
 
     @Override
-    public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+    public List<UserAuthFactory> getUserAuthFactories() {
         ClientFactoryManager manager = getFactoryManager();
-        return resolveEffectiveFactories(UserAuth.class, userAuthFactories, 
manager.getUserAuthFactories());
+        return resolveEffectiveFactories(userAuthFactories, 
manager.getUserAuthFactories());
     }
 
     @Override
-    public void setUserAuthFactories(List<NamedFactory<UserAuth>> 
userAuthFactories) {
+    public void setUserAuthFactories(List<UserAuthFactory> userAuthFactories) {
         this.userAuthFactories = userAuthFactories; // OK if null/empty - 
inherit from parent
     }
 
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
 
b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
index a8cb5e9..cccbc87 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientUserAuthService.java
@@ -30,15 +30,16 @@ import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.sshd.client.ClientAuthenticationManager;
 import org.apache.sshd.client.auth.UserAuth;
+import org.apache.sshd.client.auth.UserAuthFactory;
 import org.apache.sshd.client.auth.keyboard.UserInteraction;
 import org.apache.sshd.client.future.AuthFuture;
 import org.apache.sshd.client.future.DefaultAuthFuture;
-import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.NamedResource;
 import org.apache.sshd.common.RuntimeSshException;
 import org.apache.sshd.common.Service;
 import org.apache.sshd.common.SshConstants;
 import org.apache.sshd.common.SshException;
+import org.apache.sshd.common.auth.UserAuthMethodFactory;
 import org.apache.sshd.common.session.Session;
 import org.apache.sshd.common.session.SessionHolder;
 import org.apache.sshd.common.util.GenericUtils;
@@ -64,7 +65,7 @@ public class ClientUserAuthService
 
     private final ClientSessionImpl clientSession;
     private final List<String> clientMethods;
-    private final List<NamedFactory<UserAuth>> authFactories;
+    private final List<UserAuthFactory> authFactories;
 
     private String service;
     private List<String> serverMethods;
@@ -81,7 +82,7 @@ public class ClientUserAuthService
         String prefs = 
s.getString(ClientAuthenticationManager.PREFERRED_AUTHS);
         boolean debugEnabled = log.isDebugEnabled();
         if (GenericUtils.isEmpty(prefs)) {
-            for (NamedFactory<UserAuth> factory : authFactories) {
+            for (UserAuthFactory factory : authFactories) {
                 clientMethods.add(factory.getName());
             }
         } else {
@@ -90,7 +91,7 @@ public class ClientUserAuthService
             }
 
             for (String pref : GenericUtils.split(prefs, ',')) {
-                NamedFactory<UserAuth> factory =
+                UserAuthFactory factory =
                     NamedResource.findByName(pref, 
String.CASE_INSENSITIVE_ORDER, authFactories);
                 if (factory != null) {
                     clientMethods.add(pref);
@@ -333,7 +334,7 @@ public class ClientUserAuthService
                 return;
             }
 
-            userAuth = NamedFactory.create(authFactories, method);
+            userAuth = UserAuthMethodFactory.createUserAuth(session, 
authFactories, method);
             if (userAuth == null) {
                 throw new UnsupportedOperationException("Failed to find a 
user-auth factory for method=" + method);
             }
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/common/auth/AbstractUserAuthMethodFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/common/auth/AbstractUserAuthMethodFactory.java
index 73e8015..62d7191 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/common/auth/AbstractUserAuthMethodFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/common/auth/AbstractUserAuthMethodFactory.java
@@ -19,14 +19,18 @@
 
 package org.apache.sshd.common.auth;
 
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.logging.AbstractLoggingBean;
 
 /**
+ * @param <S> The type of {@link SessionContext} being provided
  * @param <M> Type of user authentication method
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-public abstract class AbstractUserAuthMethodFactory<M> extends 
AbstractLoggingBean implements UserAuthMethodFactory<M> {
+public abstract class AbstractUserAuthMethodFactory<S extends SessionContext, 
M extends UserAuthInstance<S>>
+        extends AbstractLoggingBean
+        implements UserAuthMethodFactory<S, M> {
     private final String name;
 
     protected AbstractUserAuthMethodFactory(String name) {
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthMethodFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthMethodFactory.java
index 9b632e7..4004120 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthMethodFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/common/auth/UserAuthMethodFactory.java
@@ -19,16 +19,21 @@
 
 package org.apache.sshd.common.auth;
 
-import org.apache.sshd.common.NamedFactory;
+import java.io.IOException;
+import java.util.Collection;
+
+import org.apache.sshd.common.NamedResource;
+import org.apache.sshd.common.session.SessionContext;
 
 /**
  * Represents a user authentication method
  *
+ * @param <S> The type of {@link SessionContext} being provided
+ * to the instance creator
  * @param <M> The authentication method factory type
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-// CHECKSTYLE:OFF
-public interface UserAuthMethodFactory<M> extends NamedFactory<M> {
+public interface UserAuthMethodFactory<S extends SessionContext, M extends 
UserAuthInstance<S>> extends NamedResource {
     /**
      * Password authentication method name
      */
@@ -48,5 +53,33 @@ public interface UserAuthMethodFactory<M> extends 
NamedFactory<M> {
      * Host-based authentication method
      */
     String HOST_BASED = "hostbased";
+
+    /**
+     * @param session The session for which authentication is required
+     * @return The authenticator instance
+     * @throws IOException If failed to create the instance
+     */
+    M createUserAuth(S session) throws IOException;
+
+    /**
+     * @param <S> The type of {@link SessionContext} being provided
+     * to the instance creator
+     * @param <M> The authentication method factory type
+     * @param session The session through which the request is being made
+     * @param factories The available factories
+     * @param name The requested factory name
+     * @return The created authenticator instance - {@code null} if no 
matching factory
+     * @throws IOException If failed to create the instance
+     */
+    static <S extends SessionContext, M extends UserAuthInstance<S>> M 
createUserAuth(
+            S session, Collection<? extends UserAuthMethodFactory<S, M>> 
factories, String name)
+                throws IOException {
+        UserAuthMethodFactory<S, M> f =
+            NamedResource.findByName(name, String.CASE_INSENSITIVE_ORDER, 
factories);
+        if (f != null) {
+            return f.createUserAuth(session);
+        } else {
+            return null;
+        }
+    }
 }
-//CHECKSTYLE:ON
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractKexFactoryManager.java
 
b/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractKexFactoryManager.java
index da4ed0e..8f1d159 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractKexFactoryManager.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractKexFactoryManager.java
@@ -60,7 +60,7 @@ public abstract class AbstractKexFactoryManager
     @Override
     public List<NamedFactory<KeyExchange>> getKeyExchangeFactories() {
         KexFactoryManager parent = getDelegate();
-        return resolveEffectiveFactories(KeyExchange.class, 
keyExchangeFactories,
+        return resolveEffectiveFactories(keyExchangeFactories,
             (parent == null) ? Collections.emptyList() : 
parent.getKeyExchangeFactories());
     }
 
@@ -72,7 +72,7 @@ public abstract class AbstractKexFactoryManager
     @Override
     public List<NamedFactory<Cipher>> getCipherFactories() {
         KexFactoryManager parent = getDelegate();
-        return resolveEffectiveFactories(Cipher.class, cipherFactories,
+        return resolveEffectiveFactories(cipherFactories,
             (parent == null) ? Collections.emptyList() : 
parent.getCipherFactories());
     }
 
@@ -84,7 +84,7 @@ public abstract class AbstractKexFactoryManager
     @Override
     public List<NamedFactory<Compression>> getCompressionFactories() {
         KexFactoryManager parent = getDelegate();
-        return resolveEffectiveFactories(Compression.class, 
compressionFactories,
+        return resolveEffectiveFactories(compressionFactories,
             (parent == null) ? Collections.emptyList() : 
parent.getCompressionFactories());
     }
 
@@ -96,7 +96,7 @@ public abstract class AbstractKexFactoryManager
     @Override
     public List<NamedFactory<Mac>> getMacFactories() {
         KexFactoryManager parent = getDelegate();
-        return resolveEffectiveFactories(Mac.class, macFactories,
+        return resolveEffectiveFactories(macFactories,
             (parent == null) ? Collections.emptyList() : 
parent.getMacFactories());
     }
 
@@ -108,7 +108,7 @@ public abstract class AbstractKexFactoryManager
     @Override
     public List<NamedFactory<Signature>> getSignatureFactories() {
         KexFactoryManager parent = getDelegate();
-        return resolveEffectiveFactories(Signature.class, signatureFactories,
+        return resolveEffectiveFactories(signatureFactories,
             (parent == null) ? Collections.emptyList() : 
parent.getSignatureFactories());
     }
 
@@ -129,8 +129,7 @@ public abstract class AbstractKexFactoryManager
         this.kexExtensionHandler = kexExtensionHandler;
     }
 
-    protected <V> List<NamedFactory<V>> resolveEffectiveFactories(
-            Class<V> factoryType, List<NamedFactory<V>> local, 
List<NamedFactory<V>> inherited) {
+    protected <V> List<V> resolveEffectiveFactories(List<V> local, List<V> 
inherited) {
         if (GenericUtils.isEmpty(local)) {
             return inherited;
         } else {
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
index c9a1b51..ad4406e 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/ServerAuthenticationManager.java
@@ -32,6 +32,7 @@ import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.server.auth.BuiltinUserAuthFactories;
 import org.apache.sshd.server.auth.UserAuth;
+import org.apache.sshd.server.auth.UserAuthFactory;
 import org.apache.sshd.server.auth.WelcomeBannerPhase;
 import org.apache.sshd.server.auth.gss.GSSAuthenticator;
 import org.apache.sshd.server.auth.gss.UserAuthGSSFactory;
@@ -157,7 +158,7 @@ public interface ServerAuthenticationManager extends 
KeyPairProviderHolder {
      *
      * @return a list of named <code>UserAuth</code> factories, never {@code 
null}/empty
      */
-    List<NamedFactory<UserAuth>> getUserAuthFactories();
+    List<UserAuthFactory> getUserAuthFactories();
 
     default String getUserAuthFactoriesNameList() {
         return NamedResource.getNames(getUserAuthFactories());
@@ -167,7 +168,7 @@ public interface ServerAuthenticationManager extends 
KeyPairProviderHolder {
         return NamedResource.getNameList(getUserAuthFactories());
     }
 
-    void setUserAuthFactories(List<NamedFactory<UserAuth>> userAuthFactories);
+    void setUserAuthFactories(List<UserAuthFactory> userAuthFactories);
 
     default void setUserAuthFactoriesNameList(String names) {
         setUserAuthFactoriesNames(GenericUtils.split(names, ','));
@@ -179,9 +180,8 @@ public interface ServerAuthenticationManager extends 
KeyPairProviderHolder {
 
     default void setUserAuthFactoriesNames(Collection<String> names) {
         BuiltinUserAuthFactories.ParseResult result = 
BuiltinUserAuthFactories.parseFactoriesList(names);
-        @SuppressWarnings({ "rawtypes", "unchecked" })
-        List<NamedFactory<UserAuth>> factories =
-                (List) 
ValidateUtils.checkNotNullAndNotEmpty(result.getParsedFactories(), "No 
supported cipher factories: %s", names);
+        List<UserAuthFactory> factories =
+            ValidateUtils.checkNotNullAndNotEmpty(result.getParsedFactories(), 
"No supported cipher factories: %s", names);
         Collection<String> unsupported = result.getUnsupportedFactories();
         ValidateUtils.checkTrue(GenericUtils.isEmpty(unsupported), 
"Unsupported cipher factories found: %s", unsupported);
         setUserAuthFactories(factories);
@@ -255,7 +255,7 @@ public interface ServerAuthenticationManager extends 
KeyPairProviderHolder {
      * @return The resolved {@link List} of {@link NamedFactory} for the 
{@link UserAuth}s
      * @see #resolveUserAuthFactories(ServerAuthenticationManager, List)
      */
-    static List<NamedFactory<UserAuth>> 
resolveUserAuthFactories(ServerAuthenticationManager manager) {
+    static List<UserAuthFactory> 
resolveUserAuthFactories(ServerAuthenticationManager manager) {
         if (manager == null) {
             return Collections.emptyList();
         } else {
@@ -273,8 +273,8 @@ public interface ServerAuthenticationManager extends 
KeyPairProviderHolder {
      * {@code null}/empty then they are used as-is.
      * @return The resolved {@link List} of {@link NamedFactory} for the 
{@link UserAuth}s
      */
-    static List<NamedFactory<UserAuth>> resolveUserAuthFactories(
-            ServerAuthenticationManager manager, List<NamedFactory<UserAuth>> 
userFactories) {
+    static List<UserAuthFactory> resolveUserAuthFactories(
+            ServerAuthenticationManager manager, List<UserAuthFactory> 
userFactories) {
         if (GenericUtils.size(userFactories) > 0) {
             return userFactories;   // use whatever the user decided
         }
@@ -283,7 +283,7 @@ public interface ServerAuthenticationManager extends 
KeyPairProviderHolder {
             return Collections.emptyList();
         }
 
-        List<NamedFactory<UserAuth>> factories = new ArrayList<>();
+        List<UserAuthFactory> factories = new ArrayList<>();
         if (manager.getPasswordAuthenticator() != null) {
             factories.add(DEFAULT_USER_AUTH_PASSWORD_FACTORY);
             factories.add(DEFAULT_USER_AUTH_KB_INTERACTIVE_FACTORY);
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java 
b/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
index b617cae..7096d9f 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/SshServer.java
@@ -33,7 +33,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.sshd.common.Closeable;
 import org.apache.sshd.common.Factory;
-import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.PropertyResolverUtils;
 import org.apache.sshd.common.ServiceFactory;
 import org.apache.sshd.common.helpers.AbstractFactoryManager;
@@ -44,7 +43,7 @@ import org.apache.sshd.common.keyprovider.KeyPairProvider;
 import org.apache.sshd.common.session.helpers.AbstractSession;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
-import org.apache.sshd.server.auth.UserAuth;
+import org.apache.sshd.server.auth.UserAuthFactory;
 import org.apache.sshd.server.auth.gss.GSSAuthenticator;
 import org.apache.sshd.server.auth.hostbased.HostBasedAuthenticator;
 import org.apache.sshd.server.auth.keyboard.KeyboardInteractiveAuthenticator;
@@ -104,7 +103,7 @@ public class SshServer extends AbstractFactoryManager 
implements ServerFactoryMa
     private SessionFactory sessionFactory;
     private CommandFactory commandFactory;
     private List<SubsystemFactory> subsystemFactories;
-    private List<NamedFactory<UserAuth>> userAuthFactories;
+    private List<UserAuthFactory> userAuthFactories;
     private KeyPairProvider keyPairProvider;
     private PasswordAuthenticator passwordAuthenticator;
     private PublickeyAuthenticator publickeyAuthenticator;
@@ -147,12 +146,12 @@ public class SshServer extends AbstractFactoryManager 
implements ServerFactoryMa
     }
 
     @Override
-    public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+    public List<UserAuthFactory> getUserAuthFactories() {
         return userAuthFactories;
     }
 
     @Override
-    public void setUserAuthFactories(List<NamedFactory<UserAuth>> 
userAuthFactories) {
+    public void setUserAuthFactories(List<UserAuthFactory> userAuthFactories) {
         this.userAuthFactories = userAuthFactories;
     }
 
@@ -267,7 +266,7 @@ public class SshServer extends AbstractFactoryManager 
implements ServerFactoryMa
 
         ValidateUtils.checkTrue(getPort() >= 0 /* zero means not set yet */, 
"Bad port number: %d", Integer.valueOf(getPort()));
 
-        List<NamedFactory<UserAuth>> authFactories = 
ServerAuthenticationManager.resolveUserAuthFactories(this);
+        List<UserAuthFactory> authFactories = 
ServerAuthenticationManager.resolveUserAuthFactories(this);
         
setUserAuthFactories(ValidateUtils.checkNotNullAndNotEmpty(authFactories, 
"UserAuthFactories not set"));
 
         ValidateUtils.checkNotNullAndNotEmpty(getChannelFactories(), 
"ChannelFactories not set");
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/AbstractUserAuthFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/AbstractUserAuthFactory.java
index af83768..a5968eb 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/AbstractUserAuthFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/AbstractUserAuthFactory.java
@@ -20,11 +20,14 @@
 package org.apache.sshd.server.auth;
 
 import org.apache.sshd.common.auth.AbstractUserAuthMethodFactory;
+import org.apache.sshd.server.session.ServerSession;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
-public abstract class AbstractUserAuthFactory extends 
AbstractUserAuthMethodFactory<UserAuth> implements UserAuthFactory {
+public abstract class AbstractUserAuthFactory
+        extends AbstractUserAuthMethodFactory<ServerSession, UserAuth>
+        implements UserAuthFactory {
     protected AbstractUserAuthFactory(String name) {
         super(name);
     }
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthFactory.java 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthFactory.java
index 49d45dc..fd73f0e 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthFactory.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthFactory.java
@@ -20,12 +20,13 @@
 package org.apache.sshd.server.auth;
 
 import org.apache.sshd.common.auth.UserAuthMethodFactory;
+import org.apache.sshd.server.session.ServerSession;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
 // CHECKSTYLE:OFF
-public interface UserAuthFactory extends UserAuthMethodFactory<UserAuth> {
+public interface UserAuthFactory extends UserAuthMethodFactory<ServerSession, 
UserAuth> {
     // nothing extra
 }
 //CHECKSTYLE:ON
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthNoneFactory.java 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthNoneFactory.java
index e42db13..75a0639 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthNoneFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/UserAuthNoneFactory.java
@@ -18,6 +18,10 @@
  */
 package org.apache.sshd.server.auth;
 
+import java.io.IOException;
+
+import org.apache.sshd.server.session.ServerSession;
+
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
  */
@@ -30,7 +34,7 @@ public class UserAuthNoneFactory extends 
AbstractUserAuthFactory {
     }
 
     @Override
-    public UserAuthNone create() {
+    public UserAuthNone createUserAuth(ServerSession session) throws 
IOException {
         return new UserAuthNone();
     }
 }
\ No newline at end of file
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSSFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSSFactory.java
index 2e61411..56b77f9 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSSFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/gss/UserAuthGSSFactory.java
@@ -18,8 +18,11 @@
  */
 package org.apache.sshd.server.auth.gss;
 
+import java.io.IOException;
+
 import org.apache.sshd.server.auth.UserAuth;
 import org.apache.sshd.server.auth.UserAuthFactory;
+import org.apache.sshd.server.session.ServerSession;
 
 /**
  * Factory class.
@@ -38,7 +41,7 @@ public class UserAuthGSSFactory implements UserAuthFactory {
     }
 
     @Override
-    public UserAuth create() {
+    public UserAuth createUserAuth(ServerSession session) throws IOException {
         return new UserAuthGSS();
     }
 }
\ No newline at end of file
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBasedFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBasedFactory.java
index 9eaec57..56d6488 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBasedFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/hostbased/UserAuthHostBasedFactory.java
@@ -19,6 +19,7 @@
 
 package org.apache.sshd.server.auth.hostbased;
 
+import java.io.IOException;
 import java.util.List;
 
 import org.apache.sshd.common.NamedFactory;
@@ -26,6 +27,7 @@ import org.apache.sshd.common.signature.Signature;
 import org.apache.sshd.common.signature.SignatureFactoriesManager;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.server.auth.AbstractUserAuthFactory;
+import org.apache.sshd.server.session.ServerSession;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
@@ -68,7 +70,7 @@ public class UserAuthHostBasedFactory extends 
AbstractUserAuthFactory implements
     }
 
     @Override
-    public UserAuthHostBased create() {
+    public UserAuthHostBased createUserAuth(ServerSession session) throws 
IOException {
         return new UserAuthHostBased(getSignatureFactories());
     }
 }
\ No newline at end of file
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
index 7166d24..b8e65a3 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/keyboard/UserAuthKeyboardInteractiveFactory.java
@@ -18,7 +18,10 @@
  */
 package org.apache.sshd.server.auth.keyboard;
 
+import java.io.IOException;
+
 import org.apache.sshd.server.auth.AbstractUserAuthFactory;
+import org.apache.sshd.server.session.ServerSession;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
@@ -32,7 +35,7 @@ public class UserAuthKeyboardInteractiveFactory extends 
AbstractUserAuthFactory
     }
 
     @Override
-    public UserAuthKeyboardInteractive create() {
+    public UserAuthKeyboardInteractive createUserAuth(ServerSession session) 
throws IOException {
         return new UserAuthKeyboardInteractive();
     }
 }
\ No newline at end of file
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPasswordFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPasswordFactory.java
index 322f552..00388fd 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPasswordFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/password/UserAuthPasswordFactory.java
@@ -18,7 +18,10 @@
  */
 package org.apache.sshd.server.auth.password;
 
+import java.io.IOException;
+
 import org.apache.sshd.server.auth.AbstractUserAuthFactory;
+import org.apache.sshd.server.session.ServerSession;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
@@ -32,7 +35,7 @@ public class UserAuthPasswordFactory extends 
AbstractUserAuthFactory {
     }
 
     @Override
-    public UserAuthPassword create() {
+    public UserAuthPassword createUserAuth(ServerSession session) throws 
IOException {
         return new UserAuthPassword();
     }
 }
\ No newline at end of file
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKeyFactory.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKeyFactory.java
index d53a02a..84569b5 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKeyFactory.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/auth/pubkey/UserAuthPublicKeyFactory.java
@@ -18,6 +18,7 @@
  */
 package org.apache.sshd.server.auth.pubkey;
 
+import java.io.IOException;
 import java.util.List;
 
 import org.apache.sshd.common.NamedFactory;
@@ -25,6 +26,7 @@ import org.apache.sshd.common.signature.Signature;
 import org.apache.sshd.common.signature.SignatureFactoriesManager;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.server.auth.AbstractUserAuthFactory;
+import org.apache.sshd.server.session.ServerSession;
 
 /**
  * @author <a href="mailto:d...@mina.apache.org";>Apache MINA SSHD Project</a>
@@ -67,7 +69,7 @@ public class UserAuthPublicKeyFactory extends 
AbstractUserAuthFactory implements
     }
 
     @Override
-    public UserAuthPublicKey create() {
+    public UserAuthPublicKey createUserAuth(ServerSession session) throws 
IOException {
         return new UserAuthPublicKey(getSignatureFactories());
     }
 }
\ No newline at end of file
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/session/AbstractServerSession.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/session/AbstractServerSession.java
index 1d5eceb..4043017 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/session/AbstractServerSession.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/session/AbstractServerSession.java
@@ -30,7 +30,6 @@ import java.util.Map;
 import java.util.Objects;
 
 import org.apache.sshd.common.FactoryManager;
-import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.NamedResource;
 import org.apache.sshd.common.RuntimeSshException;
 import org.apache.sshd.common.ServiceFactory;
@@ -59,7 +58,7 @@ import org.apache.sshd.common.util.buffer.Buffer;
 import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
 import org.apache.sshd.server.ServerAuthenticationManager;
 import org.apache.sshd.server.ServerFactoryManager;
-import org.apache.sshd.server.auth.UserAuth;
+import org.apache.sshd.server.auth.UserAuthFactory;
 import org.apache.sshd.server.auth.WelcomeBannerPhase;
 import org.apache.sshd.server.auth.gss.GSSAuthenticator;
 import org.apache.sshd.server.auth.hostbased.HostBasedAuthenticator;
@@ -80,7 +79,7 @@ public abstract class AbstractServerSession extends 
AbstractSession implements S
     private KeyboardInteractiveAuthenticator interactiveAuthenticator;
     private GSSAuthenticator gssAuthenticator;
     private HostBasedAuthenticator hostBasedAuthenticator;
-    private List<NamedFactory<UserAuth>> userAuthFactories;
+    private List<UserAuthFactory> userAuthFactories;
     private KeyPairProvider keyPairProvider;
 
     protected AbstractServerSession(ServerFactoryManager factoryManager, 
IoSession ioSession) {
@@ -167,13 +166,13 @@ public abstract class AbstractServerSession extends 
AbstractSession implements S
     }
 
     @Override
-    public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+    public List<UserAuthFactory> getUserAuthFactories() {
         ServerFactoryManager manager = getFactoryManager();
-        return resolveEffectiveFactories(UserAuth.class, userAuthFactories, 
manager.getUserAuthFactories());
+        return resolveEffectiveFactories(userAuthFactories, 
manager.getUserAuthFactories());
     }
 
     @Override
-    public void setUserAuthFactories(List<NamedFactory<UserAuth>> 
userAuthFactories) {
+    public void setUserAuthFactories(List<UserAuthFactory> userAuthFactories) {
         this.userAuthFactories = userAuthFactories; // OK if null/empty - 
inherit from parent
     }
 
diff --git 
a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
 
b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
index e3e046b..242267e 100644
--- 
a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
+++ 
b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
@@ -40,8 +40,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
-import org.apache.sshd.common.Factory;
-import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.NamedResource;
 import org.apache.sshd.common.PropertyResolverUtils;
 import org.apache.sshd.common.Service;
@@ -61,6 +59,7 @@ import org.apache.sshd.server.ServerAuthenticationManager;
 import org.apache.sshd.server.ServerFactoryManager;
 import org.apache.sshd.server.auth.AsyncAuthException;
 import org.apache.sshd.server.auth.UserAuth;
+import org.apache.sshd.server.auth.UserAuthFactory;
 import org.apache.sshd.server.auth.UserAuthNoneFactory;
 import org.apache.sshd.server.auth.WelcomeBannerPhase;
 
@@ -72,7 +71,7 @@ public class ServerUserAuthService extends AbstractCloseable 
implements Service,
     private final Map<String, Object> properties = new ConcurrentHashMap<>();
     private final ServerSession serverSession;
     private final WelcomeBannerPhase welcomePhase;
-    private List<NamedFactory<UserAuth>> userAuthFactories;
+    private List<UserAuthFactory> userAuthFactories;
     private List<List<String>> authMethods;
     private String authUserName;
     private String authMethod;
@@ -96,7 +95,7 @@ public class ServerUserAuthService extends AbstractCloseable 
implements Service,
         maxAuthRequests = this.getIntProperty(
             ServerAuthenticationManager.MAX_AUTH_REQUESTS, 
ServerAuthenticationManager.DEFAULT_MAX_AUTH_REQUESTS);
 
-        List<NamedFactory<UserAuth>> factories = 
ValidateUtils.checkNotNullAndNotEmpty(
+        List<UserAuthFactory> factories = 
ValidateUtils.checkNotNullAndNotEmpty(
             serverSession.getUserAuthFactories(), "No user auth factories for 
%s", s);
         userAuthFactories = new ArrayList<>(factories);
         // Get authentication methods
@@ -104,7 +103,7 @@ public class ServerUserAuthService extends 
AbstractCloseable implements Service,
 
         String mths = this.getString(ServerAuthenticationManager.AUTH_METHODS);
         if (GenericUtils.isEmpty(mths)) {
-            for (NamedFactory<UserAuth> uaf : factories) {
+            for (UserAuthFactory uaf : factories) {
                 authMethods.add(new 
ArrayList<>(Collections.singletonList(uaf.getName())));
             }
         } else {
@@ -118,7 +117,7 @@ public class ServerUserAuthService extends 
AbstractCloseable implements Service,
         // Verify all required methods are supported
         for (List<String> l : authMethods) {
             for (String m : l) {
-                NamedFactory<UserAuth> factory =
+                UserAuthFactory factory =
                     NamedResource.findByName(m, String.CASE_INSENSITIVE_ORDER, 
userAuthFactories);
                 if (factory == null) {
                     throw new SshException("Configured method is not 
supported: " + m);
@@ -329,7 +328,8 @@ public class ServerUserAuthService extends 
AbstractCloseable implements Service,
                   session, username, service, method, nbAuthRequests, 
maxAuthRequests);
         }
 
-        Factory<UserAuth> factory = NamedResource.findByName(method, 
String.CASE_INSENSITIVE_ORDER, userAuthFactories);
+        UserAuthFactory factory = NamedResource.findByName(
+            method, String.CASE_INSENSITIVE_ORDER, userAuthFactories);
         if (factory == null) {
             if (debugEnabled) {
                 log.debug("handleUserAuthRequestMessage({}) no authentication 
factory for method={}", session, method);
@@ -338,7 +338,8 @@ public class ServerUserAuthService extends 
AbstractCloseable implements Service,
             return true;
         }
 
-        currentAuth = ValidateUtils.checkNotNull(factory.create(), "No 
authenticator created for method=%s", method);
+        currentAuth = ValidateUtils.checkNotNull(
+            factory.createUserAuth(session), "No authenticator created for 
method=%s", method);
         try {
             Boolean authed = currentAuth.auth(session, username, service, 
buffer);
             authHolder.set(authed);
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java
 
b/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java
index d4279f9..37b0bd0 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/client/ClientAuthenticationManagerTest.java
@@ -29,14 +29,13 @@ import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.sshd.client.auth.AuthenticationIdentitiesProvider;
 import org.apache.sshd.client.auth.BuiltinUserAuthFactories;
-import org.apache.sshd.client.auth.UserAuth;
+import org.apache.sshd.client.auth.UserAuthFactory;
 import org.apache.sshd.client.auth.keyboard.UserInteraction;
 import org.apache.sshd.client.auth.password.PasswordIdentityProvider;
 import org.apache.sshd.client.keyverifier.ServerKeyVerifier;
 import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.client.session.ClientSessionImpl;
 import org.apache.sshd.common.Factory;
-import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.NamedResource;
 import org.apache.sshd.common.channel.ChannelListener;
 import org.apache.sshd.common.forward.DefaultForwarderFactory;
@@ -67,16 +66,16 @@ public class ClientAuthenticationManagerTest extends 
BaseTestSupport {
 
     @Test
     public void testDefaultUserAuthFactoriesMethods() {
-        AtomicReference<List<NamedFactory<UserAuth>>> factoriesHolder = new 
AtomicReference<>();
+        AtomicReference<List<UserAuthFactory>> factoriesHolder = new 
AtomicReference<>();
         @SuppressWarnings("checkstyle:anoninnerlength")
         ClientAuthenticationManager manager = new 
ClientAuthenticationManager() {
             @Override
-            public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+            public List<UserAuthFactory> getUserAuthFactories() {
                 return factoriesHolder.get();
             }
 
             @Override
-            public void setUserAuthFactories(List<NamedFactory<UserAuth>> 
userAuthFactories) {
+            public void setUserAuthFactories(List<UserAuthFactory> 
userAuthFactories) {
                 assertNull("Unexpected multiple invocation", 
factoriesHolder.getAndSet(userAuthFactories));
             }
 
@@ -151,8 +150,9 @@ public class ClientAuthenticationManagerTest extends 
BaseTestSupport {
         manager.setUserAuthFactoriesNameList(expected);
         assertEquals("Mismatched updated factories names", expected, 
manager.getUserAuthFactoriesNameList());
 
-        List<NamedFactory<UserAuth>> factories = factoriesHolder.get();
-        assertEquals("Mismatched factories count", 
BuiltinUserAuthFactories.VALUES.size(), GenericUtils.size(factories));
+        List<UserAuthFactory> factories = factoriesHolder.get();
+        assertEquals("Mismatched factories count",
+            BuiltinUserAuthFactories.VALUES.size(), 
GenericUtils.size(factories));
         for (BuiltinUserAuthFactories f : BuiltinUserAuthFactories.VALUES) {
             assertTrue("Missing factory=" + f.name(), 
factories.contains(f.create()));
         }
diff --git a/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java 
b/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java
index f77839d..015e0c7 100644
--- a/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/client/ClientTest.java
@@ -1145,7 +1145,7 @@ public class ClientTest extends BaseTestSupport {
         Collection<String> mismatchedPrompts = new LinkedList<>();
         client.setUserAuthFactories(Collections.singletonList(new 
UserAuthKeyboardInteractiveFactory() {
             @Override
-            public UserAuthKeyboardInteractive create() {
+            public UserAuthKeyboardInteractive createUserAuth(ClientSession 
session) throws IOException {
                 return new UserAuthKeyboardInteractive() {
                     @Override
                     protected boolean useCurrentPassword(
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java 
b/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java
index d1992d5..07e1a76 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/common/auth/AuthenticationTest.java
@@ -187,7 +187,7 @@ public class AuthenticationTest extends BaseTestSupport {
         sshd.setUserAuthFactories(Collections.singletonList(
             new org.apache.sshd.server.auth.password.UserAuthPasswordFactory() 
{
                 @Override
-                public org.apache.sshd.server.auth.password.UserAuthPassword 
create() {
+                public org.apache.sshd.server.auth.password.UserAuthPassword 
createUserAuth(ServerSession session) throws IOException {
                     return new 
org.apache.sshd.server.auth.password.UserAuthPassword() {
                         @Override
                         protected Boolean handleClientPasswordChangeRequest(
@@ -235,7 +235,7 @@ public class AuthenticationTest extends BaseTestSupport {
             client.setUserAuthFactories(Collections.singletonList(
                 new 
org.apache.sshd.client.auth.password.UserAuthPasswordFactory() {
                     @Override
-                    public 
org.apache.sshd.client.auth.password.UserAuthPassword create() {
+                    public 
org.apache.sshd.client.auth.password.UserAuthPassword 
createUserAuth(ClientSession session) throws IOException {
                         return new 
org.apache.sshd.client.auth.password.UserAuthPassword() {
                             @Override
                             protected IoWriteFuture sendPassword(
@@ -717,7 +717,7 @@ public class AuthenticationTest extends BaseTestSupport {
         sshd.setUserAuthFactories(Collections.singletonList(
                 new 
org.apache.sshd.server.auth.pubkey.UserAuthPublicKeyFactory() {
                     @Override
-                    public 
org.apache.sshd.server.auth.pubkey.UserAuthPublicKey create() {
+                    public 
org.apache.sshd.server.auth.pubkey.UserAuthPublicKey 
createUserAuth(ServerSession session) throws IOException {
                         return new 
org.apache.sshd.server.auth.pubkey.UserAuthPublicKey() {
                             @Override
                             protected void sendPublicKeyResponse(
diff --git 
a/sshd-core/src/test/java/org/apache/sshd/server/ServerAuthenticationManagerTest.java
 
b/sshd-core/src/test/java/org/apache/sshd/server/ServerAuthenticationManagerTest.java
index 9be1cb0..40eebac 100644
--- 
a/sshd-core/src/test/java/org/apache/sshd/server/ServerAuthenticationManagerTest.java
+++ 
b/sshd-core/src/test/java/org/apache/sshd/server/ServerAuthenticationManagerTest.java
@@ -22,12 +22,11 @@ package org.apache.sshd.server;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 
-import org.apache.sshd.common.NamedFactory;
 import org.apache.sshd.common.NamedResource;
 import org.apache.sshd.common.keyprovider.KeyPairProvider;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.server.auth.BuiltinUserAuthFactories;
-import org.apache.sshd.server.auth.UserAuth;
+import org.apache.sshd.server.auth.UserAuthFactory;
 import org.apache.sshd.server.auth.gss.GSSAuthenticator;
 import org.apache.sshd.server.auth.hostbased.HostBasedAuthenticator;
 import org.apache.sshd.server.auth.keyboard.KeyboardInteractiveAuthenticator;
@@ -52,16 +51,16 @@ public class ServerAuthenticationManagerTest extends 
BaseTestSupport {
 
     @Test
     public void testDefaultUserAuthFactoriesMethods() {
-        AtomicReference<List<NamedFactory<UserAuth>>> factoriesHolder = new 
AtomicReference<>();
+        AtomicReference<List<UserAuthFactory>> factoriesHolder = new 
AtomicReference<>();
         @SuppressWarnings("checkstyle:anoninnerlength")
         ServerAuthenticationManager manager = new 
ServerAuthenticationManager() {
             @Override
-            public List<NamedFactory<UserAuth>> getUserAuthFactories() {
+            public List<UserAuthFactory> getUserAuthFactories() {
                 return factoriesHolder.get();
             }
 
             @Override
-            public void setUserAuthFactories(List<NamedFactory<UserAuth>> 
userAuthFactories) {
+            public void setUserAuthFactories(List<UserAuthFactory> 
userAuthFactories) {
                 assertNull("Unexpected multiple invocation", 
factoriesHolder.getAndSet(userAuthFactories));
             }
 
@@ -131,8 +130,9 @@ public class ServerAuthenticationManagerTest extends 
BaseTestSupport {
         manager.setUserAuthFactoriesNameList(expected);
         assertEquals("Mismatched updated factories names", expected, 
manager.getUserAuthFactoriesNameList());
 
-        List<NamedFactory<UserAuth>> factories = factoriesHolder.get();
-        assertEquals("Mismatched factories count", 
BuiltinUserAuthFactories.VALUES.size(), GenericUtils.size(factories));
+        List<UserAuthFactory> factories = factoriesHolder.get();
+        assertEquals("Mismatched factories count",
+            BuiltinUserAuthFactories.VALUES.size(), 
GenericUtils.size(factories));
         for (BuiltinUserAuthFactories f : BuiltinUserAuthFactories.VALUES) {
             assertTrue("Missing factory=" + f.name(), 
factories.contains(f.create()));
         }

Reply via email to