为什么我的程序无法创建新的 JAAS 登录上下文?
Why is my program failing to create a new JAAS Login Context?
阅读 JAAS(Java 身份验证和授权)文档后,我尝试使用 JAAS 在我的 Java 应用程序中实现一个简单的 Kerberos 身份验证测试用例。我正在尝试针对我公司的 AD 服务器进行身份验证,因为我希望我的应用程序批准并记录使用它的用户的用户名,以防止未经授权的访问。
根据文档 here,我在下面创建了测试 class。此测试 class 包含在一个可执行 JAR 中,该 JAR 在正常执行期间实例化 AuthTest 的副本(从而启动构造函数代码)。我正在使用 java -jar TheJar.jar -Djava.security.auth.login.config=auth.conf
执行 jar,auth.conf
是一个 JAAS 登录配置文件,与 jar 文件位于同一目录中。
Class:
package main.java.***********.auth;
import com.sun.security.auth.callback.TextCallbackHandler;
import com.sun.security.auth.login.ConfigFile;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.NoSuchAlgorithmException;
import javax.security.auth.login.*;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
/**
*
* @author
*/
public class AuthTest {
static final Logger logger = LogManager.getLogger();
Configuration.Parameters params = null;
ConfigFile ConfigObj;
TextCallbackHandler handler;
public AuthTest(){
//Try to create Login Context
LoginContext lc = null;
try{ //try #1
lc = new LoginContext("TheJar", handler);
logger.debug("LoginContext:" + lc.toString());
}
catch(LoginException le){
logger.error(le.getMessage());
logger.error(le.getCause());
}
//ENSURE Non-null context
if (lc == null){
logger.fatal("LOGIN CONTEXT WAS NULL. PROGRAM MUST DIE");
System.exit(-1);
}
//Try To Login
try{ //try #2
lc.login();
}
catch(LoginException le){
logger.error(le.getMessage());
logger.error(le.getCause());
logger.fatal("Authentication Failed. Shutting Down");
System.exit(-1);
}
}
}
auth.conf:
TheJar {
com.sun.security.auth.module.Krb5LoginModule required;
};
然而,问题是 lc = new LoginContext("TheJar", handler);
失败并调用其下方的 catch 块。作为 Java 的新手并且之前从未使用过任何类型的身份验证组件或软件,我真的不确定自己做错了什么。该程序不断退出(即:LOGIN CONTEXT WAS NULL。PROGRAM MUST DIE),所以我知道 try #1 失败了——如前所述——我相信 lc = new LoginContext
行是罪魁祸首。我在这里做错了什么?
此外,我如何确定我的应用程序在运行时使用了 auth.config?
(编辑:我想出了这个子问题的答案:命令行设置的 java.security.auth.login.config 设置实际上是一个系统 属性。因此,像所有其他系统属性一样,它可以通过使用 System.getProperty("java.security.auth.login.config")
我忘记初始化 TextCallbackHandler handler
。
当我终于掌握时,我意识到我应该将登录错误原因 (le.getCause) 输出到调试消息中。果然,盯着我的脸是"invalid null CallbackHandler provided"。
我不知道我以前怎么没看到它,但是提供一个空的(未初始化的)CallbackHandler 导致 LoginContext 创建失败。不过幸运的是,来到 SO 让我开始关注这个关于 JAAS 的 gem:JAAS for human beings
阅读 JAAS(Java 身份验证和授权)文档后,我尝试使用 JAAS 在我的 Java 应用程序中实现一个简单的 Kerberos 身份验证测试用例。我正在尝试针对我公司的 AD 服务器进行身份验证,因为我希望我的应用程序批准并记录使用它的用户的用户名,以防止未经授权的访问。
根据文档 here,我在下面创建了测试 class。此测试 class 包含在一个可执行 JAR 中,该 JAR 在正常执行期间实例化 AuthTest 的副本(从而启动构造函数代码)。我正在使用 java -jar TheJar.jar -Djava.security.auth.login.config=auth.conf
执行 jar,auth.conf
是一个 JAAS 登录配置文件,与 jar 文件位于同一目录中。
Class:
package main.java.***********.auth;
import com.sun.security.auth.callback.TextCallbackHandler;
import com.sun.security.auth.login.ConfigFile;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.NoSuchAlgorithmException;
import javax.security.auth.login.*;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
/**
*
* @author
*/
public class AuthTest {
static final Logger logger = LogManager.getLogger();
Configuration.Parameters params = null;
ConfigFile ConfigObj;
TextCallbackHandler handler;
public AuthTest(){
//Try to create Login Context
LoginContext lc = null;
try{ //try #1
lc = new LoginContext("TheJar", handler);
logger.debug("LoginContext:" + lc.toString());
}
catch(LoginException le){
logger.error(le.getMessage());
logger.error(le.getCause());
}
//ENSURE Non-null context
if (lc == null){
logger.fatal("LOGIN CONTEXT WAS NULL. PROGRAM MUST DIE");
System.exit(-1);
}
//Try To Login
try{ //try #2
lc.login();
}
catch(LoginException le){
logger.error(le.getMessage());
logger.error(le.getCause());
logger.fatal("Authentication Failed. Shutting Down");
System.exit(-1);
}
}
}
auth.conf:
TheJar {
com.sun.security.auth.module.Krb5LoginModule required;
};
然而,问题是 lc = new LoginContext("TheJar", handler);
失败并调用其下方的 catch 块。作为 Java 的新手并且之前从未使用过任何类型的身份验证组件或软件,我真的不确定自己做错了什么。该程序不断退出(即:LOGIN CONTEXT WAS NULL。PROGRAM MUST DIE),所以我知道 try #1 失败了——如前所述——我相信 lc = new LoginContext
行是罪魁祸首。我在这里做错了什么?
此外,我如何确定我的应用程序在运行时使用了 auth.config?
(编辑:我想出了这个子问题的答案:命令行设置的 java.security.auth.login.config 设置实际上是一个系统 属性。因此,像所有其他系统属性一样,它可以通过使用 System.getProperty("java.security.auth.login.config")
我忘记初始化 TextCallbackHandler handler
。
当我终于掌握时,我意识到我应该将登录错误原因 (le.getCause) 输出到调试消息中。果然,盯着我的脸是"invalid null CallbackHandler provided"。
我不知道我以前怎么没看到它,但是提供一个空的(未初始化的)CallbackHandler 导致 LoginContext 创建失败。不过幸运的是,来到 SO 让我开始关注这个关于 JAAS 的 gem:JAAS for human beings