Любой способ чтения файла конфигурации JAAS из памяти - PullRequest
4 голосов
/ 18 сентября 2009

Мы используем JAAS на сильно загруженном веб-сервере. Файл конфигурации загружается из файла,

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

Во время профилирования мы заметили, что конфигурация загружается из файла для каждой попытки входа в систему. Это операция ввода / вывода, которую мы стараемся избегать. Есть ли способ сохранить конфигурацию JAAS в памяти?

Ответы [ 2 ]

7 голосов
/ 15 марта 2017

Следующий фрагмент кода подключается к базе данных PostgreSQL (используя pgjdbc и HikariCP) с конфигурацией JAAS в памяти, то есть не требуется 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;
            }
        };

    }

}
4 голосов
/ 18 сентября 2009

Вы можете реализовать свою собственную конфигурацию . Javadoc говорит:

Конфигурация по умолчанию реализация может быть изменена установка значения "Login.configuration.provider" свойство безопасности (в Java файл свойств безопасности) в полной мере квалифицированное имя желаемого Класс реализации конфигурации.

Реализация по умолчанию com.sun.security.auth.login.ConfigFile (source) появляется для загрузки файла каждый раз, когда создается экземпляр класса. Вы можете кэшировать содержимое. Не комментируйте аспекты безопасности в любом случае.

...