0
package com.ecom.data.access.controller;


import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.opends.server.admin.client.ldap.LDAPConnection;
import org.opends.server.types.ResultCode;
import org.springframework.ldap.AuthenticationException;
import org.springframework.ldap.NamingException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.unboundid.ldap.sdk.BindRequest;
import com.unboundid.ldap.sdk.BindResult;
import com.unboundid.ldap.sdk.SimpleBindRequest;



public class LoginController implements Controller  
{

    public static String usersContainer = "dc=example,dc=com";



    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception
    {

        String givenName1=request.getParameter("name");
        String userpassword1=request.getParameter("password");  
            System.out.println("Ldap wellcome");

        final SimpleBindRequest bindRequest=new SimpleBindRequest(givenName1, userpassword1);
        System.out.println("before");
        System.out.println(bindRequest);
        Hashtable<String, Object> env = new Hashtable<String, Object>(11);// Here we set some connection Hashtable for JNDI
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
        env.put(Context.PROVIDER_URL, "ldap://localhost:389");
        env.put( Context.SECURITY_PRINCIPAL, "cn=Directory Manager" );
        env.put( Context.SECURITY_CREDENTIALS, "admin" );
        DirContext ctx = null;

        NamingEnumeration<?> results = null;
        try {
            ctx = new InitialDirContext(env);
            SearchControls controls = new SearchControls();
            controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            String lookup="givenName="+givenName1+",dc=example,dc=com";
            String obj =  "(objectclass=*)";
            results=ctx.search(lookup, obj, controls);
            while (results.hasMore()) 
            {
                SearchResult searchResult = (SearchResult) results.next();
                Attributes attributes = searchResult.getAttributes();
                 Attribute attruser = attributes.get("givenName");
                 Attribute attrpwd=attributes.get("uid");
                 Attribute org=attributes.get("o");
                  String cn = (String)attruser.get();
                  String cn1 = (String)attrpwd.get();
                  String cn2 = (String)org.get();
             List<String> li = new ArrayList<String>();
             li.add(cn);
             li.add(cn1);
             li.add(cn2);
              if(givenName1.equals(cn) && userpassword1.equals(cn1))
                {

                    ModelAndView modelSuccess=new ModelAndView("loginPage");
                    modelSuccess.addObject("msgSuccess", li);
                    return modelSuccess;
                    }
                   else
                   {
                    ModelAndView modelError=new ModelAndView("errorPage");
                    modelError.addObject("msgError", "Invalid UserName and Password");

                    return modelError;
                    }
                   }

                } catch (Throwable e) 
                {
                }    finally 
                {
                    if (results != null) 
                    {
                        try 
                        {
                            results.close();

                        } catch (Exception e) 
                        {
                        }
                    }
                    if (ctx != null) {
                        try {
                            ctx.close();
                            } catch (Exception e) {
                            }
                    }
                }
            return null;
        }

}

Spring 3 を使用しています。LDAP に取り組んでいます。ユーザー名とパスワードが正しい場合、ユーザーを認証する必要があります。私の OpenDs には多くのフィールドがあります。名と名を使用している場合は認証されますが、パスワードを使用している場合は認証されません。これは、openDs に保存されているパスワードが暗号化されているためです。したがって、パスワードを一致させる必要があります。これについて何か提案をください。上記のコードを使用しています。

4

1 に答える 1

1

パスワードは、「ハッシュ」と呼ばれる暗号化ダイジェストとして、多くの場合userPasswordorauthPassword属性に保存する必要があります。LDAP クライアントは、BIND 要求を使用してセッションの承認状態を変更することによって認証します。SimpleBindRequest には、セッションの承認状態として使用されるアカウントの識別名 (プライマリ キー) とクリア テキストのパスワードがあります。

SimpleBindRequest は、セキュアな接続 (SSL または StartTLS 拡張要求を使用して昇格された非セキュアな接続) を介してサーバーに送信する必要があります。他の方法 (DIGEST-MD5 や CRAM-MD5 など) は、サーバーがパスワードを復号化できる必要があるため、安全でないか安全性が低くなります。したがって、パスワードは可逆暗号化で保存する必要があります。他の安全な方法には、GSSAPI または EXTERNAL SASL メカニズムが含まれます。ただし、安全な接続を介した SimpleBindRequest が最も単純です。

LDAP ディレクトリ サーバーは、提示されたパスワードを検証し、検証が成功した場合は、セッションの承認状態を変更し、BIND 応答をクライアントに返します。BIND 応答には結果コードが含まれます。結果コードがゼロ (0) の場合、認証 (および BIND 操作) は成功しています。

LDAP クライアントは、事前にエンコードされたパスワードを LDAP サーバーに提示しないでください。パスワード履歴の管理やパスワード品質管理のその他の側面が妨げられるためです。

于 2013-06-13T13:29:32.853 に答える