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

Posted

技术标签:

【中文标题】为啥我的程序无法创建新的 JAAS 登录上下文?【英文标题】:Why is my program failing to create a new JAAS Login Context?为什么我的程序无法创建新的 JAAS 登录上下文? 【发布时间】:2017-08-03 12:53:26 【问题描述】:

在阅读了一些 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@

【问题讨论】:

【参考方案1】:

我忘了初始化TextCallbackHandler handler

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

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

【讨论】:

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

以上是关于为啥我的程序无法创建新的 JAAS 登录上下文?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Tomcat 1.7 如何将附加参数传递给 JAAS

具有数据库授权的 Spring JAAS 身份验证

无法创建新的客户端 ID(用于 iOS sdk 中的 google plus 登录)

为啥我的 Spring 应用程序无法识别有人已经登录?

为啥无法在 aws elasticbeanstalk 上登录我的 springboot 应用程序?

为啥我的 Delphi 2006 应用程序的任务栏按钮上下文菜单不完整?