在LDAP上与JNDI/Java中的当前用户进行身份验证

在LDAP上与JNDI/Java中的当前用户进行身份验证,java,authentication,active-directory,ldap,jndi,Java,Authentication,Active Directory,Ldap,Jndi,我想我会找到更多关于这个话题的信息,但我没有 我必须编写一个java应用程序来检查特定用户所属的ou 但要通过服务器进行身份验证,我不能要求输入用户名和密码,也不能将其存储在源文件(或其他文件)中 JNDI和Java是否有办法与当前登录的用户进行身份验证?您所能做的就是检查是否有某个用户的用户名与当前登录Java应用程序的用户的用户名相同。没有密码,您将无法检查任何其他内容。为此,您需要一些ldap用户的用户名和密码,这些用户有权列出其他用户。然后您可以为您的用户查询LDAP 这是一个根据我使用

我想我会找到更多关于这个话题的信息,但我没有

我必须编写一个java应用程序来检查特定用户所属的ou

但要通过服务器进行身份验证,我不能要求输入用户名和密码,也不能将其存储在源文件(或其他文件)中


JNDI和Java是否有办法与当前登录的用户进行身份验证?

您所能做的就是检查是否有某个用户的用户名与当前登录Java应用程序的用户的用户名相同。没有密码,您将无法检查任何其他内容。为此,您需要一些ldap用户的用户名和密码,这些用户有权列出其他用户。然后您可以为您的用户查询LDAP

这是一个根据我使用的东西改编的示例,它检查active directory,因此可能需要一些更改:

boolean userFound = user_exits("searchUser",
        "searchPassword",
        "(sAMAccountName={USERNAME})",
        "ldap://ldap.mydomain.com",
        "OU=MYOU,dc=mydomain,dc=com");

private boolean user_exits(String searchUser, String searchPassword,
        String filter, String url, String baseDn) throws NamingException {
DirContext ctx = null;
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, searchUser);
env.put(Context.SECURITY_CREDENTIALS, searchPassword);

try {
    ctx = new InitialDirContext(env);
        String[] attributeFilter = {};
        SearchControls sc = new SearchControls();
        sc.setReturningAttributes(attributeFilter);
        sc.setSearchScope(SearchControls.SUBTREE_SCOPE);

        NamingEnumeration<SearchResult> results = ctx.search(baseDn, filter, sc);
        return results.hasMore();

    } catch (NamingException e) {
        throw e;
    } finally {
        if (ctx != null) {
            try {
                ctx.close();
            } catch (NamingException e) {}
        }
    }       
}
boolean userFound=user\u退出(“searchUser”,
“搜索密码”,
“(sAMAccountName={USERNAME})”,
"ldap://ldap.mydomain.com",
“OU=MYOU,dc=mydomain,dc=com”);
私有布尔用户_退出(字符串搜索用户、字符串搜索密码、,
字符串筛选器、字符串url、字符串baseDn)引发NamingException{
DirContext ctx=null;
Hashtable env=新的Hashtable();
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
env.put(Context.PROVIDER_URL,URL);
环境put(Context.SECURITY_认证,“simple”);
环境put(Context.SECURITY\u主体,searchUser);
env.put(Context.SECURITY\u凭证、searchPassword);
试一试{
ctx=新的初始目录上下文(env);
字符串[]attributeFilter={};
SearchControls sc=新的SearchControls();
sc.设置返回属性(属性过滤器);
sc.setSearchScope(SearchControls.SUBTREE_范围);
NamingEnumeration results=ctx.search(baseDn、filter、sc);
返回结果。hasMore();
}捕获(NamingE例外){
投掷e;
}最后{
如果(ctx!=null){
试一试{
ctx.close();
}捕获(NamingE){}
}
}       
}

如果LDAP客户端具有现有连接,请使用
我是谁?
扩展请求或
授权标识请求控件来确定现有连接的身份验证ID-符合LDAP的服务器,并且将支持任何一种方法。
我是谁?
扩展请求可以在连接上随时使用(假设身份验证身份具有使用扩展请求的权限),但
授权身份请求控制只能附加到绑定请求

中演示了
我是谁?
扩展请求和
授权身份请求控制的使用

另见

由于似乎没有真正的解决方案,我现在开始在脚本/工具开始时请求登录信息,并在需要时使用它。

当前登录到什么?你的问题似乎是循环的。通常情况下,如果您有LDAP,那么您登录的是LDAP。我认为最简单的方法是让技术用户在用户ou树上只具有读取权限。并使用该用户/通行证。您也可以依赖匿名ldap访问,但这不太安全。@EJP登录到Windows(我知道可能涉及一些破坏平台独立性的代码)。@Hovanesyan事实上我自己只有读取访问权限,我还考虑过请管理员创建一些“虚拟用户”,但我认为使用“当前Windows用户身份验证”搜索ldap是一个更好的解决方案,这正是问题所在,因为我不能在应用程序中使用某个真实用户的密码。@它不需要是真实用户。它可以是仅为此创建的用户,该用户仅具有所需的确切权限。当然,您需要将用户和密码存储在某个位置。但因为它不是一个真正的用户,所以风险较低。我请求了一些“虚拟用户”。由于我对LDAP和AD还不熟悉,我还有一个小问题。对于您所称的searchUser,我必须提供完整的dn,对吗?如果您还没有完全开始实现,请查看unbounded LDAP SDK@DominikG是的,您需要完整的dn。