質問

負荷の高いWebサーバーでJAASを使用します。構成ファイルはファイルからロードされます。

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

プロファイリング中に、ログイン試行ごとに設定がファイルからロードされることに気付きました。これは、回避しようとするI / O操作です。とにかくメモリにJAAS設定を保存する方法はありますか?

役に立ちましたか?

解決

独自の構成。 javadocのコメント:

  

デフォルトの構成   実装は次の方法で変更できます   の値を設定する   " login.configuration.provider"   セキュリティプロパティ(Java   セキュリティプロパティファイル)に完全に   希望の修飾名   構成実装クラス。

デフォルトの実装 com.sun.security.auth.login.ConfigFile(source)は、クラスがインスタンス化されるたびにファイルをロードするように見えます。コンテンツをキャッシュできます。どちらの方法でもセキュリティ面についてのコメントはありません。

他のヒント

次のコードスニペットは、メモリ内のJAAS設定でpgjdbcとHikariCPを使用してPostgreSQLデータベースに接続します。つまり、 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;
            }
        };

    }

}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top