Любой способ, чтобы прочитать файл конфигурации в систему jaas из памяти
Мы используем JAAS в сильно загруженном веб-сервере. Файл конфигурации загружается из файла,
System.setProperty("java.security.auth.login.config", "/config/jaas.config");
Во время профилирования мы заметили, что конфигурация загружается из файла при каждой попытке входа в систему. Это операция ввода-вывода, которую мы стараемся избегать. Есть ли вообще возможность хранить конфигурацию JAAS в памяти?
2 ответов:
Вы можете реализовать свою собственную конфигурацию . Джавадок говорит:
Конфигурация по умолчанию реализация может быть изменена путем установка значения параметра "вход.конфигурация.поставщик" свойство безопасности (в Java файл свойств безопасности) полностью квалифицированное наименование желаемого Класс реализации конфигурации.
Реализация по умолчанию com.солнце.безопасность.автор.авторизоваться.ConfigFile (source) появляется, чтобы загрузить файл каждый время создания экземпляра класса. Вы можете хранить содержимое в тайнике. Никаких комментариев по вопросам безопасности в любом случае.
Следующий фрагмент кода подключается к базе данных 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; } }; } }
Comments