小弟最近在做一个系统的登录验证,要求从Windows 的 AD中验证,登录名为AD中的sAMAccountName的值,自己配了一台服务器,验证是没有问题的,但访问正式服务器时却抛出异常,请教各位高手,代码如下;import java.util.Hashtable;
import java.util.List;import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;/**
* 验证用户登录
* @throws NamingException
*/
public String validateLogin() throws AMSException, NamingException {
String flag = "";
String responseMsg = "";
// 获取用户名,密码
String userName = this.getParameter("userName");
String password = this.getParameter("password");
String verifyCode = this.getParameter("verifyCode");// 文本框填写的验证码
Control[] connCtls = null;
String userDN = "";
if(null==userName){
flag = "login";
responseMsg = "1";
}else if(null==password){
flag = "login";
responseMsg = "2";
}else if(null==verifyCode){
flag = "login";
responseMsg = "3";
}else{
ServletActionContext.getRequest().setAttribute("userName", userName);
verifyCode = verifyCode.toLowerCase();
AcitiveDirectoryConfig adConfig =new AcitiveDirectoryConfig();
//activedirectory ip
String activedirectoryIP=adConfig.getADConifg("AD_IP");
//activedirectory port
String activedirectoryPort=adConfig.getADConifg("AD_PORT");
String activedirectoryRoot=adConfig.getADConifg("AD_ROOT");
String verifyCodeConfirm=ServletActionContext.getRequest().getSession().getAttribute("random").toString();//servlet生成的验证码
String ad_username = adConfig.getADConifg("AD_USERNAME");
String ad_bindpassword = adConfig.getADConifg("AD_BINDPASSWORD");
Hashtable<String, String> env = new Hashtable<String, String>();
DirContext ctx;
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://"+activedirectoryIP+":"+activedirectoryPort+"/"+activedirectoryRoot);//LDAP server
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, ad_username);
env.put(Context.SECURITY_CREDENTIALS, ad_bindpassword);
try{
ctx = new InitialLdapContext(env,connCtls);
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
System.out.println("*************************");
NamingEnumeration en = ctx.search("", "sAMAccountName="+userName, constraints);---就这句报异常
ctx.close();
if(en == null){
flag = "login";
responseMsg = "4";
System.out.println("11111111");
}
if(!en.hasMoreElements()){
flag = "login";
responseMsg = "4";
System.out.println("222222222222");
}else{
while (en != null && en.hasMoreElements()){//maybe more than one element
Object obj = en.nextElement();
if(obj instanceof SearchResult){
SearchResult si = (SearchResult) obj;
userDN += si.getName();
userDN += "," + activedirectoryRoot;
System.out.println("userDN==========================="+userDN);
try {
Hashtable<String, String> env1 = new Hashtable<String, String>();
DirContext ctx1;
env1.put(Context.PROVIDER_URL, "ldap://"+activedirectoryIP+":"+activedirectoryPort+"/"+activedirectoryRoot);
env1.put(Context.SECURITY_AUTHENTICATION, "simple");
env1.put(Context.SECURITY_PRINCIPAL, userDN);
env1.put(Context.SECURITY_CREDENTIALS, password);
env1.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
ctx1 = new InitialDirContext(env1);
ctx1.close();
ServletActionContext.getRequest().getSession().setAttribute("LoginUserName", userName);
flag = "validateLogin";
}catch (AuthenticationException e) {
System.out.println("33333333333333333");
flag = "login";
responseMsg = "4";
}catch (NamingException e) {
System.out.println("44444444444444444");
flag = "login";
responseMsg = "5";
}
}
else{
System.out.println("5555555555555555");
flag = "login";
responseMsg = "4";
}
}
}
}catch(AuthenticationException e){
System.out.println("666666666666666");
flag = "login";
responseMsg = "4";
}catch (NamingException e) {
logger.info("NamingException:"+e);
System.out.println("77777777777777777");----这里抛出
flag = "login";
responseMsg = "5";
}
}
ServletActionContext.getRequest().setAttribute("responseMsg", responseMsg);
ServletActionContext.getRequest().getSession().setAttribute("computerinfo", userProcess.getCorp());
return flag;
}我的做法是先以管理员账号登录进去(好像不容许匿名登录),根据输入的用户名(即sAMAccountName)查到匹配的那条记录(如果有这条记录),得到该用户的cn后,再次连接AD,如果成功,则登录正确,请各位大大指教错误,异常如下
*************************
11-06-10 15:48:40 [INFO ] org.apache.log4j.Logger {UserAction.java:219} - Naming
Exception:javax.naming.NamingException: [LDAP: error code 1 - 000020D6: SvcErr:
DSID-031007DB, problem 5012 (DIR_ERROR), data 0
77777777777777777说明:测试服务器为2003 正式服务器为2008 (不知道有影响没)在线等结果,急
import java.util.List;import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;/**
* 验证用户登录
* @throws NamingException
*/
public String validateLogin() throws AMSException, NamingException {
String flag = "";
String responseMsg = "";
// 获取用户名,密码
String userName = this.getParameter("userName");
String password = this.getParameter("password");
String verifyCode = this.getParameter("verifyCode");// 文本框填写的验证码
Control[] connCtls = null;
String userDN = "";
if(null==userName){
flag = "login";
responseMsg = "1";
}else if(null==password){
flag = "login";
responseMsg = "2";
}else if(null==verifyCode){
flag = "login";
responseMsg = "3";
}else{
ServletActionContext.getRequest().setAttribute("userName", userName);
verifyCode = verifyCode.toLowerCase();
AcitiveDirectoryConfig adConfig =new AcitiveDirectoryConfig();
//activedirectory ip
String activedirectoryIP=adConfig.getADConifg("AD_IP");
//activedirectory port
String activedirectoryPort=adConfig.getADConifg("AD_PORT");
String activedirectoryRoot=adConfig.getADConifg("AD_ROOT");
String verifyCodeConfirm=ServletActionContext.getRequest().getSession().getAttribute("random").toString();//servlet生成的验证码
String ad_username = adConfig.getADConifg("AD_USERNAME");
String ad_bindpassword = adConfig.getADConifg("AD_BINDPASSWORD");
Hashtable<String, String> env = new Hashtable<String, String>();
DirContext ctx;
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://"+activedirectoryIP+":"+activedirectoryPort+"/"+activedirectoryRoot);//LDAP server
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, ad_username);
env.put(Context.SECURITY_CREDENTIALS, ad_bindpassword);
try{
ctx = new InitialLdapContext(env,connCtls);
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
System.out.println("*************************");
NamingEnumeration en = ctx.search("", "sAMAccountName="+userName, constraints);---就这句报异常
ctx.close();
if(en == null){
flag = "login";
responseMsg = "4";
System.out.println("11111111");
}
if(!en.hasMoreElements()){
flag = "login";
responseMsg = "4";
System.out.println("222222222222");
}else{
while (en != null && en.hasMoreElements()){//maybe more than one element
Object obj = en.nextElement();
if(obj instanceof SearchResult){
SearchResult si = (SearchResult) obj;
userDN += si.getName();
userDN += "," + activedirectoryRoot;
System.out.println("userDN==========================="+userDN);
try {
Hashtable<String, String> env1 = new Hashtable<String, String>();
DirContext ctx1;
env1.put(Context.PROVIDER_URL, "ldap://"+activedirectoryIP+":"+activedirectoryPort+"/"+activedirectoryRoot);
env1.put(Context.SECURITY_AUTHENTICATION, "simple");
env1.put(Context.SECURITY_PRINCIPAL, userDN);
env1.put(Context.SECURITY_CREDENTIALS, password);
env1.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
ctx1 = new InitialDirContext(env1);
ctx1.close();
ServletActionContext.getRequest().getSession().setAttribute("LoginUserName", userName);
flag = "validateLogin";
}catch (AuthenticationException e) {
System.out.println("33333333333333333");
flag = "login";
responseMsg = "4";
}catch (NamingException e) {
System.out.println("44444444444444444");
flag = "login";
responseMsg = "5";
}
}
else{
System.out.println("5555555555555555");
flag = "login";
responseMsg = "4";
}
}
}
}catch(AuthenticationException e){
System.out.println("666666666666666");
flag = "login";
responseMsg = "4";
}catch (NamingException e) {
logger.info("NamingException:"+e);
System.out.println("77777777777777777");----这里抛出
flag = "login";
responseMsg = "5";
}
}
ServletActionContext.getRequest().setAttribute("responseMsg", responseMsg);
ServletActionContext.getRequest().getSession().setAttribute("computerinfo", userProcess.getCorp());
return flag;
}我的做法是先以管理员账号登录进去(好像不容许匿名登录),根据输入的用户名(即sAMAccountName)查到匹配的那条记录(如果有这条记录),得到该用户的cn后,再次连接AD,如果成功,则登录正确,请各位大大指教错误,异常如下
*************************
11-06-10 15:48:40 [INFO ] org.apache.log4j.Logger {UserAction.java:219} - Naming
Exception:javax.naming.NamingException: [LDAP: error code 1 - 000020D6: SvcErr:
DSID-031007DB, problem 5012 (DIR_ERROR), data 0
77777777777777777说明:测试服务器为2003 正式服务器为2008 (不知道有影响没)在线等结果,急
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货