Added integration of DBAuthenticator & integration test with H2 DB

This commit is contained in:
mackristof
2016-05-13 16:43:08 +02:00
committed by Christophe Mourette
parent cad1165071
commit 4bcecd5aa3
6 changed files with 192 additions and 13 deletions
@@ -38,6 +38,10 @@ public class BrokerConstants {
public static final String ACL_FILE_PROPERTY_NAME = "acl_file";
public static final String AUTHORIZATOR_CLASS_NAME = "authorizator_class";
public static final String AUTHENTICATOR_CLASS_NAME = "authenticator_class";
public static final String DB_AUTHENTICATOR_DRIVER = "authenticator.db.driver";
public static final String DB_AUTHENTICATOR_URL = "authenticator.db.url";
public static final String DB_AUTHENTICATOR_QUERY = "authenticator.db.query";
public static final String DB_AUTHENTICATOR_DIGEST = "authenticator.db.digest";
public static final int PORT = 1883;
public static final int WEBSOCKET_PORT = 8080;
public static final String HOST = "0.0.0.0";
@@ -105,7 +105,7 @@ public class SimpleMessaging {
String authenticatorClassName = props.getProperty(BrokerConstants.AUTHENTICATOR_CLASS_NAME, "");
if (!authenticatorClassName.isEmpty()) {
authenticator = (IAuthenticator)loadClass(authenticatorClassName, IAuthenticator.class);
authenticator = (IAuthenticator)loadClass(authenticatorClassName, IAuthenticator.class, props);
LOG.info("Loaded custom authenticator {}", authenticatorClassName);
}
@@ -120,7 +120,7 @@ public class SimpleMessaging {
String authorizatorClassName = props.getProperty(BrokerConstants.AUTHORIZATOR_CLASS_NAME, "");
if (!authorizatorClassName.isEmpty()) {
authorizator = (IAuthorizator)loadClass(authorizatorClassName, IAuthorizator.class);
authorizator = (IAuthorizator)loadClass(authorizatorClassName, IAuthorizator.class, props);
LOG.info("Loaded custom authorizator {}", authorizatorClassName);
}
@@ -147,7 +147,7 @@ public class SimpleMessaging {
return m_processor;
}
private Object loadClass(String className, Class<?> cls) {
private Object loadClass(String className, Class<?> cls, IConfig props) {
Object instance = null;
try {
Class<?> clazz = Class.forName(className);
@@ -163,13 +163,25 @@ public class SimpleMessaging {
}
catch (NoSuchMethodException nsmex) {
try {
// check if constructor with IConfig parameter exists
instance = this.getClass().getClassLoader()
.loadClass(className)
.asSubclass(cls)
.newInstance();
.getConstructor(IConfig.class).newInstance(props);
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException ex) {
LOG.error(null, ex);
throw new RuntimeException("Cannot load custom authenticator class " + className, ex);
} catch (NoSuchMethodException | InvocationTargetException e) {
try {
// fallback to default constructor
instance = this.getClass().getClassLoader()
.loadClass(className)
.asSubclass(cls)
.newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException ex) {
LOG.error(null, ex);
throw new RuntimeException("Cannot load custom authenticator class " + className, ex);
}
}
} catch (ClassNotFoundException ex) {
LOG.error(null, ex);
@@ -1,5 +1,7 @@
package io.moquette.spi.impl.security;
import io.moquette.BrokerConstants;
import io.moquette.server.config.IConfig;
import io.moquette.spi.security.IAuthenticator;
import org.apache.commons.codec.binary.Hex;
import org.slf4j.Logger;
@@ -25,6 +27,15 @@ public class DBAuthenticator implements IAuthenticator {
private final PreparedStatement preparedStatement;
public DBAuthenticator(IConfig conf){
this(conf.getProperty(BrokerConstants.DB_AUTHENTICATOR_DRIVER, ""),
conf.getProperty(BrokerConstants.DB_AUTHENTICATOR_URL,""),
conf.getProperty(BrokerConstants.DB_AUTHENTICATOR_QUERY, ""),
conf.getProperty(BrokerConstants.DB_AUTHENTICATOR_DIGEST,""));
}
/** provide authenticator from SQL database
* @param driver : jdbc driver class like : "org.postgresql.Driver"
* @param jdbcUrl : jdbc url like : "jdbc:postgresql://host:port/dbname"