Java 为什么我的程序无法创建新的JAAS登录上下文?

Java 为什么我的程序无法创建新的JAAS登录上下文?,java,authentication,kerberos,jaas,Java,Authentication,Kerberos,Jaas,在阅读了一些JAAS(Java身份验证和授权)文档之后,我尝试在我的Java应用程序中使用JAAS实现一个简单的Kerberos身份验证测试用例。我正在尝试对我公司的广告服务器进行身份验证,因为我希望我的应用程序批准并记录使用它的用户的用户名,以防止未经授权的访问 根据文档,我创建了下面的测试类。这个测试类包含在一个可执行JAR中,该JAR在AuthTest的正常执行期间实例化了一个副本(从而启动了构造函数代码)。我正在使用java-jar-jar-jar.jar-Djava.security.

在阅读了一些JAAS(Java身份验证和授权)文档之后,我尝试在我的Java应用程序中使用JAAS实现一个简单的Kerberos身份验证测试用例。我正在尝试对我公司的广告服务器进行身份验证,因为我希望我的应用程序批准并记录使用它的用户的用户名,以防止未经授权的访问

根据文档,我创建了下面的测试类。这个测试类包含在一个可执行JAR中,该JAR在AuthTest的正常执行期间实例化了一个副本(从而启动了构造函数代码)。我正在使用java-jar-jar-jar.jar-Djava.security.auth.login.config=auth.conf执行jar,而
auth.conf
是一个JAAS登录配置文件,它与jar文件位于同一目录中

类别:

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=newlogincontext(“TheJar”,handler)失败,并调用其下的catch块。由于对Java相当陌生,而且以前从未使用过任何类型的身份验证组件或软件,我真的不确定自己做错了什么。程序一直在退出(即:登录上下文为NULL。程序必须终止),因此我知道try#1失败了,而且正如前面提到的,我认为应该归咎于
lc=new LoginContext
行。我做错了什么

另外,如何确定我的应用程序在运行时正在使用auth.config?
(编辑:我找到了这个子问题的答案:命令行设置的java.security.auth.login.config实际上是一个系统属性。因此,与所有其他系统属性一样,可以使用
System.getProperty(“java.security.auth.login.config”)访问它。)

我忘记初始化
TextCallbackHandler

当我终于抓住了机会时,我意识到我应该将登录错误原因(le.getCause)输出到一条调试消息中


我不知道我以前怎么看不到它,但提供了一个空值(未初始化)CallbackHandler导致LoginContext创建失败。幸运的是,来到SO让我看到了这个关于JAAS的宝石:

你可以单击复选标记确认你自己的答案。如果你这样做,实际上会更好,因为你自己验证了它。忘了这一点。这是为了防止人们“玩系统游戏”.别无选择,只需在日历上做标记,两天后再来。