Cualquier forma de leer el archivo de configuración JAAS de la memoria
-
22-07-2019 - |
Pregunta
Utilizamos JAAS en un servidor web muy cargado. El archivo de configuración se carga desde un archivo,
System.setProperty("java.security.auth.login.config", "/config/jaas.config");
Durante la creación de perfiles, notamos que la configuración se carga desde el archivo para cada intento de inicio de sesión. Esta es una operación de E / S que intentamos evitar. ¿Hay alguna forma de almacenar la configuración JAAS en la memoria?
Solución
Puede implementar su propio Configuración . El javadoc dice:
La configuración predeterminada la implementación puede ser cambiada por establecer el valor de la " login.configuration.provider " propiedad de seguridad (en Java archivo de propiedades de seguridad) nombre calificado del deseado Clase de implementación de configuración.
La implementación predeterminada com.sun.security.auth.login.ConfigFile (fuente) parece cargar el archivo cada vez que se crea una instancia de la clase. Podrías almacenar en caché el contenido. No hay comentarios sobre los aspectos de seguridad de ninguna manera.
Otros consejos
El siguiente fragmento de código se conecta a una base de datos PostgreSQL (usando pgjdbc y HikariCP) con una configuración JAAS en memoria, es decir, no se requieren archivos Configuration
:
package com.vlkan.kerberos.auth;
import com.google.common.collect.ImmutableMap;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;
import javax.security.auth.login.LoginException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;
import static com.google.common.base.Preconditions.checkArgument;
public enum Main {;
private static final String JAAS_CONFIG_NAME = "pgjdbc";
public static void main(String[] args) throws LoginException, SQLException {
String jdbcUrl = "jdbc:postgresql://host/dbname";
String jdbcDriver = "org.postgresql.Driver";
String username = "user";
String password = "pass";
Configuration jaasConfig = createJaasConfig();
Configuration.setConfiguration(jaasConfig);
HikariConfig hikariConfig = createHikariConfig(jdbcUrl, jdbcDriver, username, password);
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement statement = connection.prepareStatement("SELECT 1")) {
try (ResultSet resultSet = statement.executeQuery()) {
boolean next = resultSet.next();
checkArgument(next, "no results");
int result = resultSet.getInt(1);
checkArgument(result == 1, "expecting: 1, found: %s", result);
System.out.println("ok");
}
}
}
}
private static HikariConfig createHikariConfig(String jdbcUrl, String jdbcDriver, String username, String password) {
HikariConfig config = new HikariConfig();
config.setDriverClassName(jdbcDriver);
config.setJdbcUrl(jdbcUrl);
config.setUsername(username);
config.setPassword(password);
fixKerberosProperties(config, username, password);
return config;
}
private static void fixKerberosProperties(HikariConfig config, String username, String password) {
Properties properties = new Properties();
properties.setProperty("user", username);
properties.setProperty("password", password);
properties.setProperty("JAASConfigName", JAAS_CONFIG_NAME);
config.setDataSourceProperties(properties);
}
private static Configuration createJaasConfig() {
// Create entry options.
Map<String, Object> options = ImmutableMap.of(
"useFirstPass", "false", // Do *not* use javax.security.auth.login.{name,password} from shared state.
"debug", "true" // Output debug (including plain text username and password!) messages.
);
// Create entries.
AppConfigurationEntry[] entries = {
new AppConfigurationEntry(
"com.sun.security.auth.module.Krb5LoginModule",
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
options)
};
// Create configuration.
return new Configuration() {
@Override
public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
checkArgument(JAAS_CONFIG_NAME.equals(name));
return entries;
}
};
}
}