Tout moyen de lire le fichier de configuration JAAS à partir de la mémoire
-
22-07-2019 - |
Question
Nous utilisons JAAS dans un serveur Web très chargé. Le fichier de configuration est chargé à partir d'un fichier,
System.setProperty("java.security.auth.login.config", "/config/jaas.config");
Lors de l'établissement du profil, nous avons constaté que la configuration était chargée à partir d'un fichier à chaque tentative de connexion. C’est une opération d’entrée / sortie que nous essayons d’éviter. Est-il possible de stocker la configuration JAAS en mémoire?
La solution
Vous pouvez implémenter votre propre Configuration . Le javadoc dit:
La configuration par défaut la mise en œuvre peut être modifiée par définir la valeur de la "login.configuration.provider" propriété de sécurité (en Java propriétés de sécurité) au complet nom qualifié du désiré Classe d'implémentation de la configuration.
L'implémentation par défaut com.sun.security.auth.login.ConfigFile (source) semble charger le fichier chaque fois que la classe est instanciée. Vous pouvez mettre en cache le contenu. Aucun commentaire sur les aspects de sécurité dans les deux cas.
Autres conseils
L'extrait de code suivant se connecte à une base de données PostgreSQL (à l'aide de pgjdbc et HikariCP) avec une configuration JAAS en mémoire, c'est-à-dire qu'aucun fichier Configuration
n'est requis:
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;
}
};
}
}