سؤال

ونحن نستخدم JAAS في خادم الويب تحميل بكثرة. يتم تحميل ملف التكوين من ملف،

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

وخلال التنميط، لاحظنا أن التكوين يتم تحميل من ملف لكل محاولة تسجيل الدخول. هذا هو عملية I / O نحاول تجنبه. هناك على أية حال لتخزين التكوين JAAS في الذاكرة؟

هل كانت مفيدة؟

المحلول

هل يمكن تنفيذ الخاص بك <لأ href = "http://www.j2ee.me/j2se/1.4.2/docs/api/javax/security/auth/login/Configuration.html" يختلط = "نوفولو noreferrer "> تكوين . يقول جافادوك:

<اقتباس فقرة>   

والتكوين الافتراضي   يمكن تغيير تنفيذ   تحديد قيمة   "login.configuration.provider"   الملكية الأمن (في جافا   ملف خصائص الأمان) إلى كامل   اسم مؤهل من المطلوب   فئة تطبيق التكوين.

وتطبيق الافتراضي <لأ href = "http://www.javadocexamples.com/com/sun/security/auth/login/com.sun.security.auth.login.ConfigFile-source.html" يختلط = " نوفولو noreferrer "> com.sun.security.auth.login.ConfigFile (المصدر) يبدو لتحميل الملف في كل مرة يتم إنشاء مثيل الطبقة. هل يمكن تخزين المحتويات. لا تعليق على الجوانب الأمنية في اي من الاتجاهين.

نصائح أخرى

وبعد التعليمات البرمجية المتكررة يتصل قاعدة بيانات كيو (باستخدام 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;
            }
        };

    }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top