【问题标题】:Why is my program failing to create a new JAAS Login Context?为什么我的程序无法创建新的 JAAS 登录上下文?
【发布时间】:2023-12-17 22:40:02
【问题描述】:

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

根据文档here,我在下面创建了测试类。该测试类包含在可执行 JAR 中,该 JAR 在正常执行期间实例化 AuthTest 的副本(从而启动构造函数代码)。我正在使用java -jar TheJar.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 = new LoginContext("TheJar", handler); 失败并调用它下面的catch 块。作为 Java 新手,之前从未使用过任何类型的身份验证组件或软件,我真的不确定自己做错了什么。该程序不断退出(即:LOGIN CONTEXT WAS NULL。PROGRAM MUST DIE),所以我知道尝试#1 失败并且--如前所述--我相信lc = new LoginContext 行应该受到责备。我在这里做错了什么?

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

【问题讨论】:

    标签: java authentication kerberos jaas


    【解决方案1】:

    我忘了初始化TextCallbackHandler handler

    当我终于掌握了,我意识到我应该将登录错误原因 (le.getCause) 输出到调试消息中。果然,盯着我的脸是“提供了无效的 null CallbackHandler”。

    我不知道我以前怎么没有看到它,但是提供一个 null(未初始化的)CallbackHandler 导致 LoginContext 创建失败。不过幸运的是,来到 SO 让我开始关注关于 JAAS 的这颗宝石:JAAS for human beings

    【讨论】:

    • 您可以单击复选标记以确认您自己的答案。如果你这样做实际上会更好,因为你自己验证了它。
    • 忘记了。这是为了防止人们形成“游戏系统”。无事可做,只需要标记您的日历并在两天后回来。
    最近更新 更多