2009-09-18 6 views
3

Nous utilisons JAAS sur un serveur Web très chargé. Le fichier de configuration est chargé à partir d'un fichier,Toute façon de lire le fichier de configuration JAAS depuis la mémoire

System.setProperty("java.security.auth.login.config", "/config/jaas.config"); 

Au cours de profilage, nous avons remarqué que la configuration est chargée à partir du fichier pour chaque tentative de connexion. C'est une opération d'E/S que nous essayons d'éviter. Est-il possible de stocker la configuration JAAS en mémoire?

Répondre

4

Vous pouvez implémenter votre propre Configuration. Le javadoc dit:

La configuration par défaut mise en œuvre peut être modifiée par le réglage de la valeur du « login.configuration.provider » propriété de sécurité (dans les propriétés de sécurité Java fichier) à pleinement qualifié nom de la classe d'implémentation de configuration souhaitée.

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é de toute façon.

4

Après l'extrait de code se connecte à une base de données PostgreSQL (à l'aide de pgjdbc et HikariCP) avec une configuration JAAS en mémoire, qui est, sans Configuration fichiers sont nécessaires:

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

    } 

} 
+1

Grande réponse, m'a beaucoup aidé! Je ne recommanderais pas d'utiliser la classe privée 'Krb5LoginModule' car vous auriez besoin d'inclure' rt.jar' dans les bibliothèques de votre projet. – lazlev

+0

@lazlev, merci. J'ai mis à jour le code. –

Questions connexes