java - GSSAPI 之后 JNDI 搜索不起作用(使用 Kerberos 进行身份验证)

标签 java jndi kerberos gssapi mit-kerberos

我从互联网上获得了以下示例,用于使用 JNDI 测试 GSSAPI。

public class GssExample {

    public static void main(String[] args) {

        System.setProperty("java.security.auth.login.config", "C:\\gssapi_jaas.conf");
        System.setProperty("java.security.krb5.conf", "C:\\krb5.conf");

        LoginContext lc = null;
        try {
            lc = new LoginContext(GssExample.class.getName(),
                    new LoginCallBackHandler());
            lc.login();

        } catch (LoginException le) {
        }

        Subject.doAs(lc.getSubject(), new JndiAction(args));
    }
}

class JndiAction implements java.security.PrivilegedAction {

    public Object run() {
        performJndiOperation(args);
        return null;
    }

    private static void performJndiOperation(String[] args) {
        Hashtable<String, String> env = new Hashtable<String, String>(11);

        env.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL,
                "ldap://XXXX.domain.lab:389/OU=StackOverFlow,dc=domain,dc=lab");
        env.put(Context.SECURITY_AUTHENTICATION, "GSSAPI");
        env.put("javax.security.sasl.server.authentication", "true");

        try {

            DirContext ctx = new InitialDirContext(env);
            // Fails here with exception as shown below
            NamingEnumeration<SearchResult> _result = ctx.search("DC=domain,DC=lab","(objectClass=User)", null);
            ctx.close();
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

我得到的异常是

javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-03100241, problem 2001 (NO_OBJECT), data 0, best match of: 'OU=StackOverFlow,DC=domain,DC=lab'

请注意:该 OU 存在于 AD 系统上。

LoginCallBackHandler 的代码如下

class LoginCallBackHandler implements CallbackHandler {

    @Override
    public void handle(Callback[] callbacks) throws IOException,
            UnsupportedCallbackException {
        if(callbacks != null && callbacks.length > 0) {
            if(callbacks[0] instanceof NameCallback) {
                ((NameCallback)(callbacks[0])).setName("User@DOMAIN.LAB");
            }
            else if(callbacks[0] instanceof PasswordCallback) {
                ((PasswordCallback)(callbacks[0])).setPassword("Password".toCharArray());
            }
        }
    }
}

我是否遗漏了什么或者我做错了什么?

最佳答案

该错误与身份验证无关。您错误地使用了 LDAP 搜索。您已经限制了您的搜索库 DN ldap://XXXX.domain.lab:389/OU=StackOverFlow,dc=domain,dc=lab 。然后您提供了 ctx.search("DC=domain,DC=lab",... ,但是没有树DC=domain,DC=lab,OU=StackOverFlow,dc=domain,dc=lab .

要么提供另一个仅包含 RootDSE 的 LDAP URL,要么提供一个空字符串 search() .

关于java - GSSAPI 之后 JNDI 搜索不起作用(使用 Kerberos 进行身份验证),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48580433/

相关文章:

java - 为什么 flatMap() 之后的 filter() 在 Java 流中是 "not completely"惰性?

java - Java 中的集中式数据库连接管理

java - 尽管allowtgtsessionkey注册表项无法检索TGT

java - 用java提取文本

java - 如何将信息添加到库的日志消息中?

java - 用于分割字符串的正则表达式

java - 每次都在上下文中查找数据源,是吗?

java - 如何将 spring mail session jndi xml 配置迁移到 java config

python - JIRA REST API 和 kerberos 身份验证

hadoop - 我们可以在Cloudera Hadoop集群中将hbase.rpc.protection属性值设置为none吗?如果是,那怎么办?