Added DBAuthenticator & Test with H2 DB

This commit is contained in:
mackristof
2016-05-12 15:47:49 +02:00
committed by mackristof
parent d24f14a8f2
commit cad1165071
3 changed files with 170 additions and 0 deletions
@@ -0,0 +1,85 @@
package io.moquette.spi.impl.security;
import io.moquette.spi.security.IAuthenticator;
import org.apache.commons.codec.binary.Hex;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.*;
/**
* Load user credentials from a SQL database.
* sql driver must be provided at runtime
*
* @author mackristof
*/
public class DBAuthenticator implements IAuthenticator {
private static final Logger LOG = LoggerFactory.getLogger(DBAuthenticator.class);
private final String sqlQuery;
private final MessageDigest messageDigest;
private final PreparedStatement preparedStatement;
/** provide authenticator from SQL database
* @param driver : jdbc driver class like : "org.postgresql.Driver"
* @param jdbcUrl : jdbc url like : "jdbc:postgresql://host:port/dbname"
* @param sqlQuery : sql query like : "SELECT PASSWORD FROM USER WHERE LOGIN=?"
* @param digestMethod : password encoding algorithm : "MD5", "SHA-1", "SHA-256"
*/
public DBAuthenticator(String driver, String jdbcUrl, String sqlQuery, String digestMethod){
this.sqlQuery = sqlQuery;
try {
Class.forName(driver);
final Connection connection = DriverManager.getConnection(jdbcUrl);
this.messageDigest = MessageDigest.getInstance(digestMethod);
this.preparedStatement = connection.prepareStatement(sqlQuery);
} catch (ClassNotFoundException cnfe){
LOG.error(String.format("Can't find driver %s", driver), cnfe);
throw new RuntimeException(cnfe);
} catch (SQLException sqle) {
LOG.error(String.format("Can't connect to %s", jdbcUrl), sqle);
throw new RuntimeException(sqle);
} catch (NoSuchAlgorithmException nsaex) {
LOG.error(String.format("Can't find %s for password encoding", digestMethod), nsaex);
throw new RuntimeException(nsaex);
}
}
@Override
public synchronized boolean checkValid(String username, byte[] password) {
// Check Username / Password in DB using sqlQuery
if (username == null || password == null) {
LOG.info("username or password was null");
return false;
}
ResultSet r= null;
try {
this.preparedStatement.setString(1,username);
r = this.preparedStatement.executeQuery();
if(r.next()) {
final String foundPwq = r.getString(1);
messageDigest.update(password);
byte[] digest = messageDigest.digest();
String encodedPasswd = new String(Hex.encodeHex(digest));
return foundPwq.equals(encodedPasswd);
}
r.close();
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
@Override
protected void finalize() throws Throwable {
this.preparedStatement.close();
this.preparedStatement.getConnection().close();
super.finalize();
}
}