메모리에서 JAAS 구성 파일을 읽는 방법
-
22-07-2019 - |
문제
우리는 심하게로드 된 웹 서버에서 JAA를 사용합니다. 구성 파일은 파일에서로드됩니다.
System.setProperty("java.security.auth.login.config", "/config/jaas.config");
프로파일 링 중에는 모든 로그인 시도마다 파일에서 구성이로드된다는 것을 알았습니다. 이것은 우리가 피하려고하는 I/O 운영입니다. 어쨌든 JAAS 구성을 메모리에 저장해야합니까?
해결책
직접 구현할 수 있습니다 구성. Javadoc의 말 :
"login.configuration.provider"보안 속성 (Java Security Properties File)의 값을 원하는 구성 구현 클래스의 정규화 된 이름으로 설정하여 기본 구성 구현을 변경할 수 있습니다.
기본 구현 com.sun.security.auth.login.configfile (출처) 클래스가 인스턴스화 될 때마다 파일을로드하는 것으로 보입니다. 내용을 캐시 할 수 있습니다. 보안 측면에 대한 의견은 없습니다.
다른 팁
다음 코드 스 니펫은 Memory jaas 구성을 사용하여 PostgreSQL 데이터베이스 (PGJDBC 및 HikarICP 사용)에 연결됩니다. 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;
}
};
}
}
제휴하지 않습니다 StackOverflow