Java 从内存中读取JAAS配置文件的任何方法

Java 从内存中读取JAAS配置文件的任何方法,java,security,authentication,jaas,Java,Security,Authentication,Jaas,我们在负载沉重的web服务器中使用JAAS。配置文件是从一个文件加载的 System.setProperty("java.security.auth.login.config", "/config/jaas.config"); 在分析过程中,我们注意到每次登录尝试都会从文件加载配置。这是我们试图避免的I/O操作。是否仍有将JAAS配置存储在内存中的方法?您可以实现自己的配置。javadoc说: 默认配置 可通过以下方式更改实现: 设置 “login.configuration.provid

我们在负载沉重的web服务器中使用JAAS。配置文件是从一个文件加载的

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

在分析过程中,我们注意到每次登录尝试都会从文件加载配置。这是我们试图避免的I/O操作。是否仍有将JAAS配置存储在内存中的方法?

您可以实现自己的配置。javadoc说:

默认配置 可通过以下方式更改实现: 设置 “login.configuration.provider” 安全属性(在Java中) 安全属性文件)以完全 所需对象的限定名称 配置实现类


每次实例化类时,默认实现都会加载该文件。你可以缓存内容。无论采用哪种方式,都不对安全性方面发表评论。

以下代码片段连接到具有内存JAAS配置的PostgreSQL数据库(使用pgjdbc和HikariCP),即不需要
配置
文件:

包com.vlkan.kerberos.auth;
导入com.google.common.collect.ImmutableMap;
导入com.zaxxer.hikari.HikariConfig;
导入com.zaxxer.hikari.HikariDataSource;
导入javax.security.auth.login.AppConfigurationEntry;
导入javax.security.auth.login.Configuration;
导入javax.security.auth.login.LoginException;
导入java.sql.Connection;
导入java.sql.PreparedStatement;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入java.util.Map;
导入java.util.Properties;
导入静态com.google.common.base.premissions.checkArgument;
公共枚举主{;
私有静态最终字符串JAAS_CONFIG_NAME=“pgjdbc”;
publicstaticvoidmain(字符串[]args)抛出LoginException、SQLException{
String jdbcUrl=“jdbc:postgresql://host/dbname";
字符串jdbcDriver=“org.postgresql.Driver”;
字符串username=“user”;
字符串password=“pass”;
配置jaasConfig=createJaasConfig();
配置.setConfiguration(jaasConfig);
HikariConfig HikariConfig=createHikariConfig(jdbcUrl、jdbcDriver、用户名、密码);
HikariDataSource数据源=新的HikariDataSource(hikariConfig);
try(Connection=dataSource.getConnection()){
try(PreparedStatement=connection.prepareStatement(“选择1”)){
try(ResultSet ResultSet=statement.executeQuery()){
布尔next=resultSet.next();
checkArgument(下一步,“无结果”);
int result=resultSet.getInt(1);
checkArgument(结果==1,“应为:1,找到:%s”,结果);
System.out.println(“ok”);
}
}
}
}
私有静态HikariConfig createHikariConfig(字符串jdbcUrl、字符串jdbcDriver、字符串用户名、字符串密码){
HikariConfig config=新的HikariConfig();
config.setDriverClassName(jdbcDriver);
config.setJdbcUrl(jdbcUrl);
config.setUsername(用户名);
config.setPassword(密码);
FixKerberosProperty(配置、用户名、密码);
返回配置;
}
私有静态void fixkerberosproperty(HikariConfig配置、字符串用户名、字符串密码){
属性=新属性();
setProperty(“用户”,用户名);
设置属性(“密码”,密码);
setProperty(“JAASConfigName”,JAAS\u CONFIG\u名称);
config.setDataSourceProperties(属性);
}
私有静态配置createJaasConfig(){
//创建条目选项。
映射选项=ImmutableMap.of(
“useFirstPass”、“false”//不*使用javax.security.auth.login.{name,password}来自共享状态。
“debug”、“true”//Output debug(包括纯文本用户名和密码!)消息。
);
//创建条目。
AppConfigurationEntry[]条目={
新AppConfigurationEntry(
“com.sun.security.auth.module.Krb5LoginModule”,
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
选项)
};
//创建配置。
返回新配置(){
@凌驾
公共AppConfigurationEntry[]getAppConfigurationEntry(字符串名称){
checkArgument(JAAS_CONFIG_NAME.equals(NAME));
返回条目;
}
};
}
}

回答得很好,帮了我很多忙!不建议使用私有类
Krb5LoginModule
,因为您需要在项目库中包含
rt.jar