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?

Était-ce utile?

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;
            }
        };

    }

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top