Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LDAP:如何使用连接详细信息对用户进行身份验证_Java_Spring_Ldap_Spring Ldap_Ldapconnection - Fatal编程技术网

Java LDAP:如何使用连接详细信息对用户进行身份验证

Java LDAP:如何使用连接详细信息对用户进行身份验证,java,spring,ldap,spring-ldap,ldapconnection,Java,Spring,Ldap,Spring Ldap,Ldapconnection,我无法使用LDAP对用户进行身份验证。我有以下资料: URL=ldap://10.10.10.10:389 LDAP BASE:DC=lab2,DC=ins LDAP Bind Account: CN=Ldap Bind,OU=Service Accounts,OU=TECH,DC=lab2,DC=ins LDAP Bind Account Pw: secret 我可以使用上述详细信息搜索sAMAccountName值,但如何使用用户名和密码验证用户? 如果您按照我前面的问题进行操作,

我无法使用LDAP对用户进行身份验证。我有以下资料:

URL=ldap://10.10.10.10:389 
LDAP BASE:DC=lab2,DC=ins 
LDAP Bind Account: CN=Ldap Bind,OU=Service Accounts,OU=TECH,DC=lab2,DC=ins 
LDAP Bind Account Pw: secret 
我可以使用上述详细信息搜索
sAMAccountName
值,但如何使用用户名和密码验证用户?
如果您按照我前面的问题进行操作,您就会明白,我可以成功连接到LDAP服务器,但无法对其进行身份验证。
要进行身份验证的用户:

user: someusername
password: somepwd

我无法使用
'somepwd'
连接到LDAP服务器,我应该如何使用
someusername
。我能够以
sAMAccountName
的形式搜索给定用户,LDAP连接以
匿名的方式启动。要更改连接的授权状态,请使用绑定请求。绑定请求有两种形式,“simple”或“SASL”。“简单”绑定请求采用可分辨名称和密码。绑定请求应通过安全连接传输,或使用
StartTLS
扩展请求将非安全连接升级为安全连接

使用未绑定的LDAP SDK:

// exception handling not shown
LDAPConnection ldapConnection = new LDAPConnection(hostname,port);
BindRequest bindRequest = new SimpleBindRequest(username,password);
BindResult bindResult = ldapConnection.bind(bindRequest);
if(bindResult.getResultCode().equals(ResultCode.SUCCESS)) {
   /// successful authentication
}
ldapConnection.close();

这是我在不同地方找到的东西的混合体。如果您不想使用未绑定的SDK,它应该让您走上正确的道路。这不是生产质量问题,如果您的商店支持,您可能需要在此处添加SSL内容。

public静态布尔validateLogin(字符串用户名、字符串用户密码){
Hashtable env=新的Hashtable();
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
环境put(Context.PROVIDER_URL,“ldap://”+ldap_SERVER+:“+ldap_SERVER_PORT+”/“+ldap_BASE_DN);
//使用Active Directory时消除PartialResultException的步骤
环境投入(Context.reference,“follow”);
//绑定所需(有权查询LDAP服务器的用户)
环境put(Context.SECURITY_认证,“simple”);
环境put(Context.SECURITY\u PRINCIPAL,LDAP\u BIND\u DN);
环境put(Context.SECURITY\u凭证、LDAP\u绑定\u密码);
dirctx;
试一试{
ctx=新的初始目录上下文(env);
}捕获(NamingE例外){
抛出新的运行时异常(e);
}
NamingEnumeration结果=空;
试一试{
SearchControls=新的SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);//搜索整个子树
controls.setCountLimit(1);//设置作为搜索结果返回的最大条目数
controls.setTimeLimit(5000);//以毫秒为单位设置这些SearchControl的时间限制
字符串searchString=“(&(objectCategory=user)(sAMAccountName=“+userName+”));
结果=ctx.search(“,searchString,controls);
if(results.hasMore()){
SearchResult=(SearchResult)results.next();
Attributes attrs=result.getAttributes();
属性dnAttr=attrs.get(“DifferentizedName”);
字符串dn=(字符串)dnAttr.get();
//用户已存在,请验证密码
环境put(Context.SECURITY_PRINCIPAL,dn);
env.put(Context.SECURITY\u凭证、用户密码);
new InitialDirContext(env);//将对无效的大小写引发异常
返回true;
} 
其他的
返回false;
}catch(AuthenticationException e){//登录无效
返回false;
}catch(NameNotFoundException){//未找到基上下文。
返回false;
}捕获(SizeLimitExceedeException e){
抛出新的RuntimeException(“超过LDAP查询限制,调整查询以带回更少的记录”,e);
}捕获(NamingE例外){
抛出新的运行时异常(e);
}最后{
如果(结果!=null){
尝试{results.close();}catch(异常e){/*不执行任何操作*/}
}
如果(ctx!=null){
请尝试{ctx.close();}捕获(异常e){/*不执行任何操作*/}
}
}
}

这可能会有帮助。

试试这个,它对我很有用

public static Boolean validateLogin(String userName, String userPassword) {
    Hashtable<String, String> env = new Hashtable<String, String>();


    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://" + LDAP_SERVER + ":" + LDAP_SERVER_PORT + "/" + LDAP_BASE_DN);
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, userName + "@" + LDAP_SERVER);
    env.put(Context.SECURITY_CREDENTIALS, userPassword);

    DirContext ctx;
    try {
       ctx = new InitialDirContext(env); //throw exception, if username-password not correct
       return true;
    } catch (Exception e) {
        return false;
    }
}
public静态布尔validateLogin(字符串用户名、字符串用户密码){
Hashtable env=新的Hashtable();
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
环境put(Context.PROVIDER_URL,“ldap://”+ldap_SERVER+:“+ldap_SERVER_PORT+”/“+ldap_BASE_DN);
环境put(Context.SECURITY_认证,“simple”);
环境put(Context.SECURITY_主体,用户名+“@”+LDAP_服务器);
env.put(Context.SECURITY\u凭证、用户密码);
dirctx;
试一试{
ctx=newinitialdircontext(env);//如果用户名密码不正确,则引发异常
返回true;
}捕获(例外e){
返回false;
}
}

您有正确的密码吗?使用像JXplorer这样的客户端是否有效?@DmitryB我可以使用“secret”连接到服务器,但不能使用“somepwd”。那么我应该在哪里以及如何使用给定的输入用户密码?在这个例子中是“somepwd”。如果我理解你的问题,你想使用。或者您首先在创建LDAP上下文时遇到了问题?由于客户端的限制,我无法使用未绑定的LDAP SDK。还有其他方法可以实现吗?对于SimpleBindRequest的构造函数,您应该给出DN。不是用户名。这是迄今为止我见过的最好的解决方案,我特别希望在绑定到LDAP服务器后对用户进行身份验证。这与连接池一起使用安全吗?这段代码很棒,对我帮助很大。我要提到的一件事是,我们必须设置一个要从中搜索的基本DN,将空字符串作为ctx.search的第一个参数替换为基本DN。我怀疑现在您几乎必须为任何LDAP提供商执行此操作,所以在使用此代码时请注意这一点。
public static Boolean validateLogin(String userName, String userPassword) {
    Hashtable<String, String> env = new Hashtable<String, String>();


    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://" + LDAP_SERVER + ":" + LDAP_SERVER_PORT + "/" + LDAP_BASE_DN);
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, userName + "@" + LDAP_SERVER);
    env.put(Context.SECURITY_CREDENTIALS, userPassword);

    DirContext ctx;
    try {
       ctx = new InitialDirContext(env); //throw exception, if username-password not correct
       return true;
    } catch (Exception e) {
        return false;
    }
}