From 600002531e3f7b166fd02f8c5c88056204d5ab17 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 28 Jul 2016 11:20:19 -0700 Subject: [PATCH 1/3] GUACAMOLE-5: Use singleton Guice Injector via common base class. --- .../auth/jdbc/JDBCAuthenticationProvider.java | 101 ++++++++++++++++++ .../auth/jdbc/JDBCInjectorProvider.java | 90 ++++++++++++++++ .../mysql/MySQLAuthenticationProvider.java | 78 +------------- .../auth/mysql/MySQLInjectorProvider.java | 51 +++++++++ .../PostgreSQLAuthenticationProvider.java | 85 +-------------- .../PostgreSQLInjectorProvider.java | 51 +++++++++ 6 files changed, 301 insertions(+), 155 deletions(-) create mode 100644 extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProvider.java create mode 100644 extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCInjectorProvider.java create mode 100644 extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLInjectorProvider.java create mode 100644 extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLInjectorProvider.java diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProvider.java new file mode 100644 index 000000000..ebacd13ce --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProvider.java @@ -0,0 +1,101 @@ +/* + * 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.guacamole.auth.jdbc; + +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.UserContext; +import org.apache.guacamole.auth.jdbc.user.AuthenticationProviderService; +import org.apache.guacamole.net.auth.AuthenticatedUser; + +/** + * Provides a base implementation of an AuthenticationProvider which is backed + * by an arbitrary underlying database. It is up to the subclass implementation + * to configure the underlying database appropriately via Guice. + * + * @author James Muehlner + * @author Michael Jumper + */ +public abstract class JDBCAuthenticationProvider implements AuthenticationProvider { + + /** + * Provider of the singleton Injector instance which will manage the object + * graph of this authentication provider. + */ + private final JDBCInjectorProvider injectorProvider; + + /** + * Creates a new AuthenticationProvider that is backed by an arbitrary + * underlying database. + * + * @param injectorProvider + * A JDBCInjectorProvider instance which provides singleton instances + * of a Guice Injector, pre-configured to set up all injections and + * access to the underlying database via MyBatis. + */ + public JDBCAuthenticationProvider(JDBCInjectorProvider injectorProvider) { + this.injectorProvider = injectorProvider; + } + + @Override + public AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + + Injector injector = injectorProvider.get(); + + // Create AuthenticatedUser based on credentials, if valid + AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); + return authProviderService.authenticateUser(this, credentials); + + } + + @Override + public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + + // No need to update authenticated users + return authenticatedUser; + + } + + @Override + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + + Injector injector = injectorProvider.get(); + + // Create UserContext based on credentials, if valid + AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); + return authProviderService.getUserContext(authenticatedUser); + + } + + @Override + public UserContext updateUserContext(UserContext context, + AuthenticatedUser authenticatedUser) throws GuacamoleException { + + // No need to update the context + return context; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCInjectorProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCInjectorProvider.java new file mode 100644 index 000000000..839616e85 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCInjectorProvider.java @@ -0,0 +1,90 @@ +/* + * 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.guacamole.auth.jdbc; + +import com.google.inject.Injector; +import java.util.concurrent.atomic.AtomicReference; +import org.apache.guacamole.GuacamoleException; + +/** + * A caching provider of singleton Guice Injector instances. The first call to + * get() will return a new instance of the Guice Injector, while all subsequent + * calls will return that same instance. It is up to implementations of this + * class to define how the Guice Injector will be created through defining the + * create() function. + * + * IMPORTANT: Because the Injector returned by get() is cached statically, only + * ONE implementation of this class may be used within any individual + * classloader. Within the context of the JDBC extension, as long as each built + * extension only provides one subclass of this class, things should work + * properly, as each extension is given its own classloader by Guacamole. + * + * @author Michael Jumper + */ +public abstract class JDBCInjectorProvider { + + /** + * An AtomicReference wrapping the cached Guice Injector. If the Injector + * has not yet been created, null will be wrapped instead. + */ + private static final AtomicReference injector = new AtomicReference(null); + + /** + * Creates a new instance of the Guice Injector which should be used + * across the entire JDBC authentication extension. This function will + * generally only be called once, but multiple invocations are possible if + * get() is invoked several times concurrently prior to the Injector being + * cached. + * + * @return + * @throws GuacamoleException + */ + protected abstract Injector create() throws GuacamoleException; + + /** + * Returns a common, singleton instance of a Guice Injector, configured for + * the injections required by the JDBC authentication extension. The result + * of the first call to this function will be cached statically within this + * class, and will be returned for all subsequent calls. + * + * @return + * A singleton instance of the Guice Injector used across the entire + * JDBC authentication extension. + * + * @throws GuacamoleException + * If the Injector cannot be created due to an error. + */ + public Injector get() throws GuacamoleException { + + // Return existing Injector if already created + Injector value = injector.get(); + if (value != null) + return value; + + // Explicitly create and store new Injector only if necessary + injector.compareAndSet(null, create()); + + // Consistently return the same Injector, even if two create operations + // happen concurrently + return injector.get(); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java index 8db48b7ac..e7521633b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java @@ -19,15 +19,7 @@ package org.apache.guacamole.auth.mysql; -import com.google.inject.Guice; -import com.google.inject.Injector; -import org.apache.guacamole.GuacamoleException; -import org.apache.guacamole.net.auth.AuthenticationProvider; -import org.apache.guacamole.net.auth.Credentials; -import org.apache.guacamole.net.auth.UserContext; -import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderModule; -import org.apache.guacamole.auth.jdbc.user.AuthenticationProviderService; -import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProvider; /** * Provides a MySQL based implementation of the AuthenticationProvider @@ -36,39 +28,15 @@ import org.apache.guacamole.net.auth.AuthenticatedUser; * @author James Muehlner * @author Michael Jumper */ -public class MySQLAuthenticationProvider implements AuthenticationProvider { - - /** - * Injector which will manage the object graph of this authentication - * provider. - */ - private final Injector injector; +public class MySQLAuthenticationProvider extends JDBCAuthenticationProvider { /** * Creates a new MySQLAuthenticationProvider that reads and writes * authentication data to a MySQL database defined by properties in * guacamole.properties. - * - * @throws GuacamoleException - * If a required property is missing, or an error occurs while parsing - * a property. */ - public MySQLAuthenticationProvider() throws GuacamoleException { - - // Get local environment - MySQLEnvironment environment = new MySQLEnvironment(); - - // Set up Guice injector. - injector = Guice.createInjector( - - // Configure MySQL-specific authentication - new MySQLAuthenticationProviderModule(environment), - - // Configure JDBC authentication core - new JDBCAuthenticationProviderModule(environment) - - ); - + public MySQLAuthenticationProvider() { + super(new MySQLInjectorProvider()); } @Override @@ -76,42 +44,4 @@ public class MySQLAuthenticationProvider implements AuthenticationProvider { return "mysql"; } - @Override - public AuthenticatedUser authenticateUser(Credentials credentials) - throws GuacamoleException { - - // Create AuthenticatedUser based on credentials, if valid - AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); - return authProviderService.authenticateUser(this, credentials); - - } - - @Override - public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, - Credentials credentials) throws GuacamoleException { - - // No need to update authenticated users - return authenticatedUser; - - } - - @Override - public UserContext getUserContext(AuthenticatedUser authenticatedUser) - throws GuacamoleException { - - // Create UserContext based on credentials, if valid - AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); - return authProviderService.getUserContext(authenticatedUser); - - } - - @Override - public UserContext updateUserContext(UserContext context, - AuthenticatedUser authenticatedUser) throws GuacamoleException { - - // No need to update the context - return context; - - } - } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLInjectorProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLInjectorProvider.java new file mode 100644 index 000000000..09c40be7c --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLInjectorProvider.java @@ -0,0 +1,51 @@ +/* + * 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.guacamole.auth.mysql; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderModule; +import org.apache.guacamole.auth.jdbc.JDBCInjectorProvider; + +/** + * JDBCInjectorProvider implementation which configures Guice injections for + * connecting to a MySQL database based on MySQL-specific options provided via + * guacamole.properties. + * + * @author Michael Jumper + */ +public class MySQLInjectorProvider extends JDBCInjectorProvider { + + @Override + protected Injector create() throws GuacamoleException { + + // Get local environment + MySQLEnvironment environment = new MySQLEnvironment(); + + // Set up Guice injector + return Guice.createInjector( + new JDBCAuthenticationProviderModule(environment), + new MySQLAuthenticationProviderModule(environment) + ); + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java index cd37d0598..1c4b816ca 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java @@ -19,17 +19,7 @@ package org.apache.guacamole.auth.postgresql; -import com.google.inject.Guice; -import com.google.inject.Injector; -import org.apache.guacamole.GuacamoleException; -import org.apache.guacamole.net.auth.AuthenticationProvider; -import org.apache.guacamole.net.auth.Credentials; -import org.apache.guacamole.net.auth.UserContext; -import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderModule; -import org.apache.guacamole.auth.jdbc.user.AuthenticationProviderService; -import org.apache.guacamole.net.auth.AuthenticatedUser; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProvider; /** * Provides a PostgreSQL-based implementation of the AuthenticationProvider @@ -38,44 +28,15 @@ import org.slf4j.LoggerFactory; * @author James Muehlner * @author Michael Jumper */ -public class PostgreSQLAuthenticationProvider implements AuthenticationProvider { - - /** - * Logger for this class. - */ - private static final Logger logger = LoggerFactory.getLogger(PostgreSQLAuthenticationProvider.class); - - /** - * Injector which will manage the object graph of this authentication - * provider. - */ - private final Injector injector; +public class PostgreSQLAuthenticationProvider extends JDBCAuthenticationProvider { /** * Creates a new PostgreSQLAuthenticationProvider that reads and writes * authentication data to a PostgreSQL database defined by properties in * guacamole.properties. - * - * @throws GuacamoleException - * If a required property is missing, or an error occurs while parsing - * a property. */ - public PostgreSQLAuthenticationProvider() throws GuacamoleException { - - // Get local environment - PostgreSQLEnvironment environment = new PostgreSQLEnvironment(); - - // Set up Guice injector. - injector = Guice.createInjector( - - // Configure PostgreSQL-specific authentication - new PostgreSQLAuthenticationProviderModule(environment), - - // Configure JDBC authentication core - new JDBCAuthenticationProviderModule(environment) - - ); - + public PostgreSQLAuthenticationProvider() { + super(new PostgreSQLInjectorProvider()); } @Override @@ -83,42 +44,4 @@ public class PostgreSQLAuthenticationProvider implements AuthenticationProvider return "postgresql"; } - @Override - public AuthenticatedUser authenticateUser(Credentials credentials) - throws GuacamoleException { - - // Create AuthenticatedUser based on credentials, if valid - AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); - return authProviderService.authenticateUser(this, credentials); - - } - - @Override - public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, - Credentials credentials) throws GuacamoleException { - - // No need to update authenticated users - return authenticatedUser; - - } - - @Override - public UserContext getUserContext(AuthenticatedUser authenticatedUser) - throws GuacamoleException { - - // Create UserContext based on credentials, if valid - AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); - return authProviderService.getUserContext(authenticatedUser); - - } - - @Override - public UserContext updateUserContext(UserContext context, - AuthenticatedUser authenticatedUser) throws GuacamoleException { - - // No need to update the context - return context; - - } - } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLInjectorProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLInjectorProvider.java new file mode 100644 index 000000000..ff34399c0 --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLInjectorProvider.java @@ -0,0 +1,51 @@ +/* + * 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.guacamole.auth.postgresql; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderModule; +import org.apache.guacamole.auth.jdbc.JDBCInjectorProvider; + +/** + * JDBCInjectorProvider implementation which configures Guice injections for + * connecting to a PostgreSQL database based on PostgreSQL-specific options + * provided via guacamole.properties. + * + * @author Michael Jumper + */ +public class PostgreSQLInjectorProvider extends JDBCInjectorProvider { + + @Override + protected Injector create() throws GuacamoleException { + + // Get local environment + PostgreSQLEnvironment environment = new PostgreSQLEnvironment(); + + // Set up Guice injector + return Guice.createInjector( + new JDBCAuthenticationProviderModule(environment), + new PostgreSQLAuthenticationProviderModule(environment) + ); + + } + +} From 4e3212f9fda500223f8b24f43f403d4bf540eb43 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 28 Jul 2016 17:16:03 -0700 Subject: [PATCH 2/3] GUACAMOLE-5: Use AuthenticationProviderService as the means of defining AuthenticationProvider behavior. --- .../AuthenticationProviderService.java | 78 ++--------------- ...va => InjectedAuthenticationProvider.java} | 54 ++++++------ .../JDBCAuthenticationProviderService.java | 85 +++++++++++++++++++ .../mysql/MySQLAuthenticationProvider.java | 14 ++- .../PostgreSQLAuthenticationProvider.java | 14 ++- 5 files changed, 140 insertions(+), 105 deletions(-) rename extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/{user => }/AuthenticationProviderService.java (51%) rename extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/{JDBCAuthenticationProvider.java => InjectedAuthenticationProvider.java} (62%) create mode 100644 extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderService.java diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/AuthenticationProviderService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/AuthenticationProviderService.java similarity index 51% rename from extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/AuthenticationProviderService.java rename to extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/AuthenticationProviderService.java index 3e61cf536..a821bfa2d 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/AuthenticationProviderService.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/AuthenticationProviderService.java @@ -17,19 +17,13 @@ * under the License. */ -package org.apache.guacamole.auth.jdbc.user; +package org.apache.guacamole.auth.jdbc; -import com.google.inject.Inject; -import com.google.inject.Provider; import org.apache.guacamole.GuacamoleException; -import org.apache.guacamole.auth.jdbc.sharing.ConnectionSharingService; -import org.apache.guacamole.auth.jdbc.sharing.SharedConnectionUser; -import org.apache.guacamole.auth.jdbc.sharing.SharedConnectionUserContext; import org.apache.guacamole.net.auth.AuthenticatedUser; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Credentials; -import org.apache.guacamole.net.auth.credentials.CredentialsInfo; -import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; +import org.apache.guacamole.net.auth.UserContext; /** * Service which authenticates users based on credentials and provides for @@ -38,31 +32,7 @@ import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsExce * * @author Michael Jumper */ -public class AuthenticationProviderService { - - /** - * Service for accessing users. - */ - @Inject - private UserService userService; - - /** - * Provider for retrieving UserContext instances. - */ - @Inject - private Provider userContextProvider; - - /** - * Provider for retrieving SharedConnectionUserContext instances. - */ - @Inject - private Provider sharedUserContextProvider; - - /** - * Service for sharing active connections. - */ - @Inject - private ConnectionSharingService sharingService; +public interface AuthenticationProviderService { /** * Authenticates the user having the given credentials, returning a new @@ -86,24 +56,7 @@ public class AuthenticationProviderService { * credentials are invalid or expired. */ public AuthenticatedUser authenticateUser(AuthenticationProvider authenticationProvider, - Credentials credentials) throws GuacamoleException { - - AuthenticatedUser user; - - // Check whether user is authenticating with a valid sharing key - user = sharingService.retrieveSharedConnectionUser(authenticationProvider, credentials); - if (user != null) - return user; - - // Authenticate user - user = userService.retrieveAuthenticatedUser(authenticationProvider, credentials); - if (user != null) - return user; - - // Otherwise, unauthorized - throw new GuacamoleInvalidCredentialsException("Invalid login", CredentialsInfo.USERNAME_PASSWORD); - - } + Credentials credentials) throws GuacamoleException; /** * Returning a new UserContext instance for the given already-authenticated @@ -121,26 +74,7 @@ public class AuthenticationProviderService { * If an error occurs during authentication, or if the given * credentials are invalid or expired. */ - public org.apache.guacamole.net.auth.UserContext getUserContext( - AuthenticatedUser authenticatedUser) throws GuacamoleException { - - // Produce sharing-specific user context if this is the user of a shared connection - if (authenticatedUser instanceof SharedConnectionUser) { - SharedConnectionUserContext context = sharedUserContextProvider.get(); - context.init((SharedConnectionUser) authenticatedUser); - return context; - } - - // Retrieve user account for already-authenticated user - ModeledUser user = userService.retrieveUser(authenticatedUser); - if (user == null) - return null; - - // Link to user context - UserContext context = userContextProvider.get(); - context.init(user.getCurrentUser()); - return context; - - } + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException; } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java similarity index 62% rename from extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProvider.java rename to extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java index ebacd13ce..cc25e4ac5 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProvider.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java @@ -24,48 +24,58 @@ import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Credentials; import org.apache.guacamole.net.auth.UserContext; -import org.apache.guacamole.auth.jdbc.user.AuthenticationProviderService; import org.apache.guacamole.net.auth.AuthenticatedUser; /** - * Provides a base implementation of an AuthenticationProvider which is backed - * by an arbitrary underlying database. It is up to the subclass implementation - * to configure the underlying database appropriately via Guice. + * Provides a base implementation of an AuthenticationProvider which delegates + * the various function calls to an underlying AuthenticationProviderService + * implementation. As such a service is injectable by Guice, this provides a + * means for Guice to (effectively) apply dependency injection to an + * AuthenticationProvider, even though it is the AuthenticationProvider that + * serves as the entry point. * - * @author James Muehlner * @author Michael Jumper */ -public abstract class JDBCAuthenticationProvider implements AuthenticationProvider { +public abstract class InjectedAuthenticationProvider implements AuthenticationProvider { /** - * Provider of the singleton Injector instance which will manage the object - * graph of this authentication provider. + * The AuthenticationProviderService to which all AuthenticationProvider + * calls will be delegated. */ - private final JDBCInjectorProvider injectorProvider; + private final AuthenticationProviderService authProviderService; /** - * Creates a new AuthenticationProvider that is backed by an arbitrary - * underlying database. + * Creates a new AuthenticationProvider that delegates all calls to an + * underlying AuthenticationProviderService. The behavior of the + * AuthenticationProvider is defined by the given + * AuthenticationProviderService implementation, which will be injected by + * the Guice Injector provided by the given JDBCInjectorProvider. * * @param injectorProvider * A JDBCInjectorProvider instance which provides singleton instances * of a Guice Injector, pre-configured to set up all injections and * access to the underlying database via MyBatis. + * + * @param authProviderServiceClass + * The AuthenticationProviderService implementation which defines the + * behavior of this AuthenticationProvider. + * + * @throws GuacamoleException + * If the Injector cannot be created due to an error. */ - public JDBCAuthenticationProvider(JDBCInjectorProvider injectorProvider) { - this.injectorProvider = injectorProvider; + public InjectedAuthenticationProvider(JDBCInjectorProvider injectorProvider, + Class authProviderServiceClass) + throws GuacamoleException { + + Injector injector = injectorProvider.get(); + authProviderService = injector.getInstance(authProviderServiceClass); + } @Override public AuthenticatedUser authenticateUser(Credentials credentials) throws GuacamoleException { - - Injector injector = injectorProvider.get(); - - // Create AuthenticatedUser based on credentials, if valid - AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); return authProviderService.authenticateUser(this, credentials); - } @Override @@ -80,13 +90,7 @@ public abstract class JDBCAuthenticationProvider implements AuthenticationProvid @Override public UserContext getUserContext(AuthenticatedUser authenticatedUser) throws GuacamoleException { - - Injector injector = injectorProvider.get(); - - // Create UserContext based on credentials, if valid - AuthenticationProviderService authProviderService = injector.getInstance(AuthenticationProviderService.class); return authProviderService.getUserContext(authenticatedUser); - } @Override diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderService.java new file mode 100644 index 000000000..07b7382bb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/JDBCAuthenticationProviderService.java @@ -0,0 +1,85 @@ +/* + * 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.guacamole.auth.jdbc; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.user.ModeledUser; +import org.apache.guacamole.auth.jdbc.user.UserContext; +import org.apache.guacamole.auth.jdbc.user.UserService; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; + +/** + * AuthenticationProviderService implementation which authenticates users with + * a username/password pair, producing new UserContext objects which are backed + * by an underlying, arbitrary database. + * + * @author Michael Jumper + */ +public class JDBCAuthenticationProviderService implements AuthenticationProviderService { + + /** + * Service for accessing users. + */ + @Inject + private UserService userService; + + /** + * Provider for retrieving UserContext instances. + */ + @Inject + private Provider userContextProvider; + + @Override + public AuthenticatedUser authenticateUser(AuthenticationProvider authenticationProvider, + Credentials credentials) throws GuacamoleException { + + // Authenticate user + AuthenticatedUser user = userService.retrieveAuthenticatedUser(authenticationProvider, credentials); + if (user != null) + return user; + + // Otherwise, unauthorized + throw new GuacamoleInvalidCredentialsException("Invalid login", CredentialsInfo.USERNAME_PASSWORD); + + } + + @Override + public org.apache.guacamole.net.auth.UserContext getUserContext( + AuthenticatedUser authenticatedUser) throws GuacamoleException { + + // Retrieve user account for already-authenticated user + ModeledUser user = userService.retrieveUser(authenticatedUser); + if (user == null) + return null; + + // Link to user context + UserContext context = userContextProvider.get(); + context.init(user.getCurrentUser()); + return context; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java index e7521633b..e8ba3073b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLAuthenticationProvider.java @@ -19,7 +19,9 @@ package org.apache.guacamole.auth.mysql; -import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProvider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.InjectedAuthenticationProvider; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderService; /** * Provides a MySQL based implementation of the AuthenticationProvider @@ -28,15 +30,19 @@ import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProvider; * @author James Muehlner * @author Michael Jumper */ -public class MySQLAuthenticationProvider extends JDBCAuthenticationProvider { +public class MySQLAuthenticationProvider extends InjectedAuthenticationProvider { /** * Creates a new MySQLAuthenticationProvider that reads and writes * authentication data to a MySQL database defined by properties in * guacamole.properties. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. */ - public MySQLAuthenticationProvider() { - super(new MySQLInjectorProvider()); + public MySQLAuthenticationProvider() throws GuacamoleException { + super(new MySQLInjectorProvider(), JDBCAuthenticationProviderService.class); } @Override diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java index 1c4b816ca..f8ef00d9e 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLAuthenticationProvider.java @@ -19,7 +19,9 @@ package org.apache.guacamole.auth.postgresql; -import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProvider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.InjectedAuthenticationProvider; +import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProviderService; /** * Provides a PostgreSQL-based implementation of the AuthenticationProvider @@ -28,15 +30,19 @@ import org.apache.guacamole.auth.jdbc.JDBCAuthenticationProvider; * @author James Muehlner * @author Michael Jumper */ -public class PostgreSQLAuthenticationProvider extends JDBCAuthenticationProvider { +public class PostgreSQLAuthenticationProvider extends InjectedAuthenticationProvider { /** * Creates a new PostgreSQLAuthenticationProvider that reads and writes * authentication data to a PostgreSQL database defined by properties in * guacamole.properties. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. */ - public PostgreSQLAuthenticationProvider() { - super(new PostgreSQLInjectorProvider()); + public PostgreSQLAuthenticationProvider() throws GuacamoleException { + super(new PostgreSQLInjectorProvider(), JDBCAuthenticationProviderService.class); } @Override From 06a7ca1b7a70d699d9e7a2fa57f8bcef760a3177 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 28 Jul 2016 19:45:43 -0700 Subject: [PATCH 3/3] GUACAMOLE-5: Handle shared connections via dedicated AuthenticationProvider. --- .../SharedAuthenticationProviderService.java | 84 +++++++++++++++++++ .../MySQLSharedAuthenticationProvider.java | 52 ++++++++++++ .../src/main/resources/guac-manifest.json | 3 +- ...ostgreSQLSharedAuthenticationProvider.java | 52 ++++++++++++ .../src/main/resources/guac-manifest.json | 3 +- 5 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedAuthenticationProviderService.java create mode 100644 extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLSharedAuthenticationProvider.java create mode 100644 extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLSharedAuthenticationProvider.java diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedAuthenticationProviderService.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedAuthenticationProviderService.java new file mode 100644 index 000000000..1ca667abb --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/SharedAuthenticationProviderService.java @@ -0,0 +1,84 @@ +/* + * 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.guacamole.auth.jdbc.sharing; + +import com.google.inject.Inject; +import com.google.inject.Provider; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.AuthenticationProviderService; +import org.apache.guacamole.net.auth.AuthenticatedUser; +import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.Credentials; +import org.apache.guacamole.net.auth.credentials.CredentialsInfo; +import org.apache.guacamole.net.auth.credentials.GuacamoleInvalidCredentialsException; + +/** + * Service which authenticates users based on share keys and provides for the + * creation of corresponding. The created UserContext objects are restricted to + * the connections associated with those share keys via a common + * ConnectionSharingService. + * + * @author Michael Jumper + */ +public class SharedAuthenticationProviderService implements AuthenticationProviderService { + + /** + * Provider for retrieving SharedConnectionUserContext instances. + */ + @Inject + private Provider sharedUserContextProvider; + + /** + * Service for sharing active connections. + */ + @Inject + private ConnectionSharingService sharingService; + + @Override + public AuthenticatedUser authenticateUser(AuthenticationProvider authenticationProvider, + Credentials credentials) throws GuacamoleException { + + // Check whether user is authenticating with a valid sharing key + AuthenticatedUser user = sharingService.retrieveSharedConnectionUser(authenticationProvider, credentials); + if (user != null) + return user; + + // Otherwise, unauthorized + throw new GuacamoleInvalidCredentialsException("Invalid login", CredentialsInfo.USERNAME_PASSWORD); + + } + + @Override + public org.apache.guacamole.net.auth.UserContext getUserContext( + AuthenticatedUser authenticatedUser) throws GuacamoleException { + + // Produce sharing-specific user context if this is the user of a shared connection + if (authenticatedUser instanceof SharedConnectionUser) { + SharedConnectionUserContext context = sharedUserContextProvider.get(); + context.init((SharedConnectionUser) authenticatedUser); + return context; + } + + // No shared connections otherwise + return null; + + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLSharedAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLSharedAuthenticationProvider.java new file mode 100644 index 000000000..f9ae15e6b --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/java/org/apache/guacamole/auth/mysql/MySQLSharedAuthenticationProvider.java @@ -0,0 +1,52 @@ +/* + * 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.guacamole.auth.mysql; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.InjectedAuthenticationProvider; +import org.apache.guacamole.auth.jdbc.sharing.SharedAuthenticationProviderService; + +/** + * Provides a implementation of AuthenticationProvider which interacts with the + * MySQL AuthenticationProvider, accepting share keys as credentials and + * providing access to the shared connections. + * + * @author Michael Jumper + */ +public class MySQLSharedAuthenticationProvider extends InjectedAuthenticationProvider { + + /** + * Creates a new MySQLSharedAuthenticationProvider that provides access to + * shared connections exposed by the MySQLAuthenticationProvider. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public MySQLSharedAuthenticationProvider() throws GuacamoleException { + super(new MySQLInjectorProvider(), SharedAuthenticationProviderService.class); + } + + @Override + public String getIdentifier() { + return "mysql-shared"; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/guac-manifest.json index 1aa0b8c57..7d92900e3 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/guac-manifest.json +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/src/main/resources/guac-manifest.json @@ -6,7 +6,8 @@ "namespace" : "guac-mysql", "authProviders" : [ - "org.apache.guacamole.auth.mysql.MySQLAuthenticationProvider" + "org.apache.guacamole.auth.mysql.MySQLAuthenticationProvider", + "org.apache.guacamole.auth.mysql.MySQLSharedAuthenticationProvider" ], "translations" : [ diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLSharedAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLSharedAuthenticationProvider.java new file mode 100644 index 000000000..c2f78c3ec --- /dev/null +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/java/org/apache/guacamole/auth/postgresql/PostgreSQLSharedAuthenticationProvider.java @@ -0,0 +1,52 @@ +/* + * 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.guacamole.auth.postgresql; + +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.auth.jdbc.InjectedAuthenticationProvider; +import org.apache.guacamole.auth.jdbc.sharing.SharedAuthenticationProviderService; + +/** + * Provides a implementation of AuthenticationProvider which interacts with the + * PostgreSQL AuthenticationProvider, accepting share keys as credentials and + * providing access to the shared connections. + * + * @author Michael Jumper + */ +public class PostgreSQLSharedAuthenticationProvider extends InjectedAuthenticationProvider { + + /** + * Creates a new PostgreSQLSharedAuthenticationProvider that provides access + * to shared connections exposed by the PostgreSQLAuthenticationProvider. + * + * @throws GuacamoleException + * If a required property is missing, or an error occurs while parsing + * a property. + */ + public PostgreSQLSharedAuthenticationProvider() throws GuacamoleException { + super(new PostgreSQLInjectorProvider(), SharedAuthenticationProviderService.class); + } + + @Override + public String getIdentifier() { + return "postgresql-shared"; + } + +} diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/guac-manifest.json index 64d6a23e6..1f259c4c0 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/guac-manifest.json +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-postgresql/src/main/resources/guac-manifest.json @@ -6,7 +6,8 @@ "namespace" : "guac-postgresql", "authProviders" : [ - "org.apache.guacamole.auth.postgresql.PostgreSQLAuthenticationProvider" + "org.apache.guacamole.auth.postgresql.PostgreSQLAuthenticationProvider", + "org.apache.guacamole.auth.postgresql.PostgreSQLSharedAuthenticationProvider" ], "translations" : [