您的位置:首页 > 编程语言 > Java开发

java 通过LDAP 验证、添加、修改、删除

2015-08-27 13:09 597 查看

1. 域服务器(dc=dctest,dc=com),安装证书服务,创建企业根证书,名称为dctest.com

则:cn=dctest.com,dc=dctest,dc=com

2. 申请证书类型域控制器的证书

3. 将企业根证书和域控制器证书导入到应用服务器cacerts

4. 在应用程序中,编写代码引用cacerts认证。

keytool

[java]view plaincopy
  1. packagebof.usermanager.auth.impl;
  2. importjava.io.IOException;
  3. importjava.util.ArrayList;
  4. importjava.util.List;
  5. importjava.util.Properties;
  6. importjavax.naming.AuthenticationException;
  7. importjavax.naming.Context;
  8. importjavax.naming.NamingEnumeration;
  9. importjavax.naming.NamingException;
  10. importjavax.naming.directory.Attribute;
  11. importjavax.naming.directory.Attributes;
  12. importjavax.naming.directory.BasicAttribute;
  13. importjavax.naming.directory.BasicAttributes;
  14. importjavax.naming.directory.DirContext;
  15. importjavax.naming.directory.ModificationItem;
  16. importjavax.naming.directory.SearchControls;
  17. importjavax.naming.directory.SearchResult;
  18. importjavax.naming.ldap.Control;
  19. importjavax.naming.ldap.InitialLdapContext;
  20. importjavax.naming.ldap.LdapContext;
  21. importcom.report.service.PropertyItem;
  22. importcom.report.vo.OrganizationalUnitDomain;
  23. importcom.report.vo.UserDomain;
  24. /**
  25. *功能:本操作类提供AD域用户的增、删、查、改功能
  26. *作者:陈艺武
  27. *日期:2010-4-13
  28. */
  29. publicclassLdapADManager{
  30. protectedDataSourceConnectLDAPVOtransientInstance=null;
  31. /**用户的objectClass*/
  32. privateStringdefault_objectclass="user";
  33. /**用户的默认根DN*/
  34. privateStringdefault_base="CN=Users,DC=all,DC=com";
  35. /**用户默认主键*/
  36. privateStringkey_index="CN";
  37. /**用户默认密码属性.*/
  38. privateStringpwd_index="unicodePwd";
  39. privateControl[]connCtls=null;
  40. privatestaticLdapADManagerLdapADManager=null;
  41. privateLdapADManager(){}
  42. publicstaticLdapADManagergetInstance(){
  43. if(LdapADManager==null)
  44. LdapADManager=newLdapADManager();
  45. returnLdapADManager;
  46. }
  47. /**
  48. *从连接池中获取一个连接.
  49. *
  50. *@returnLdapContext
  51. *@throwsNamingException
  52. */
  53. publicLdapContextgetConnectionFromFool()throwsNamingException{
  54. PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
  55. Stringkeystore="c:/Java/jdk1.6.0_10/jre/lib/security/cacerts";
  56. System.setProperty("javax.net.ssl.trustStore",keystore);
  57. Propertiesenv=newProperties();
  58. env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
  59. env.put("com.sun.jndi.ldap.connect.pool","true");
  60. env.put(Context.SECURITY_AUTHENTICATION,"simple");
  61. env.put(Context.SECURITY_PROTOCOL,"ssl");
  62. //env.put("java.naming.referral","follow");
  63. env.put(Context.PROVIDER_URL,ldapProperty.getLdapURL());
  64. connCtls=newControl[]{newLdapADManagerControl()};
  65. returnnewInitialLdapContext(env,connCtls);
  66. }
  67. /**
  68. *功能:校验用户登录.
  69. *@paramuserName
  70. *@parampassword
  71. *@return
  72. *
  73. *作者:陈艺武
  74. *日期:Apr13,2010
  75. */
  76. publicbooleanauthenticate(StringuserName,Stringpassword){
  77. PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
  78. StringuserDn=userName+"@"+ldapProperty.getDomain();
  79. LdapContextctx=null;
  80. try{
  81. ctx=getConnectionFromFool();
  82. ctx.getRequestControls();
  83. ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,userDn);
  84. ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,password);
  85. ctx.reconnect(connCtls);
  86. returntrue;
  87. }catch(AuthenticationExceptione){
  88. e.printStackTrace();
  89. returnfalse;
  90. }catch(NamingExceptione){
  91. e.printStackTrace();
  92. returnfalse;
  93. }finally{
  94. try{
  95. ctx.close();
  96. }catch(Exceptione){
  97. e.printStackTrace();
  98. }
  99. }
  100. }
  101. /**
  102. *功能:获取AD用户列表
  103. *@return
  104. *
  105. *作者:陈艺武
  106. *日期:Apr12,2010
  107. */
  108. publicListlistUser(){
  109. PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
  110. Listlist=newArrayList();
  111. LdapContextctx=null;
  112. UserDomainuser=null;
  113. Stringbase="OU="+ldapProperty.getBase()+","+ldapProperty.getDomainDC();
  114. try{
  115. ctx=this.getConnectionFromFool();
  116. ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,ldapProperty.getUserName()+"@"+ldapProperty.getDomain());
  117. ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,ldapProperty.getPassWord());
  118. //base="OU=北京华融综合投资公司,DC=bjhr,DC=com,DC=cn";
  119. Stringfilter="(&(objectCategory=person)(objectClass=USER)(name=*))";
  120. SearchControlscontrols=newSearchControls();
  121. controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
  122. //controls.setReturningAttributes(newString[]{"sAMAccountName","displayName","department"});
  123. controls.setReturningAttributes(newString[]{"sAMAccountName","cn"});
  124. NamingEnumeration<SearchResult>answer=ctx.search(base,filter,controls);
  125. while(answer.hasMore()){
  126. user=newUserDomain();
  127. SearchResultresult=answer.next();
  128. NamingEnumeration<?extendsAttribute>attrs=result.getAttributes().getAll();
  129. intcount=0;
  130. while(attrs.hasMore()){
  131. Attributeattr=attrs.next();
  132. if(count==0){
  133. user.setUserName(attr.get().toString());
  134. }else{
  135. user.setUserAliasName(attr.get().toString());
  136. }
  137. count++;
  138. }
  139. user.setNameSpace(ldapProperty.getDomain());
  140. list.add(user);
  141. }
  142. }catch(Exceptione){
  143. e.printStackTrace();
  144. }finally{
  145. try{
  146. ctx.close();
  147. }catch(Exceptione){
  148. e.printStackTrace();
  149. }
  150. }
  151. returnlist;
  152. }
  153. /**
  154. *功能:查询组织单位列表
  155. *@paramouName
  156. *@return
  157. *
  158. *作者:陈艺武
  159. *日期:Apr13,2010
  160. *说明:base格式如:"OU=北京华融综合投资公司,DC=bjhr,DC=com,DC=cn";
  161. */
  162. publicListlistOrganizztionalUnit(StringouName){
  163. PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
  164. Listlist=newArrayList();
  165. LdapContextctx=null;
  166. OrganizationalUnitDomainouDomain=null;
  167. Stringbase="OU="+ldapProperty.getBase()+","+ldapProperty.getDomainDC();
  168. try{
  169. ctx=this.getConnectionFromFool();
  170. ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,ldapProperty.getUserName()+"@"+ldapProperty.getDomain());
  171. ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,ldapProperty.getPassWord());
  172. Stringfilter="(&(objectClass=organizationalUnit)";
  173. if(ouName!=null&&!ouName.equals(""))
  174. filter=filter+"(name=*"+ouName+"*)";
  175. filter=filter+")";
  176. SearchControlscontrols=newSearchControls();
  177. controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
  178. controls.setReturningAttributes(newString[]{"name"});
  179. NamingEnumeration<SearchResult>answer=ctx.search(base,filter,controls);
  180. while(answer.hasMore()){
  181. ouDomain=newOrganizationalUnitDomain();
  182. SearchResultresult=answer.next();
  183. NamingEnumeration<?extendsAttribute>attrs=result.getAttributes().getAll();
  184. intcount=0;
  185. while(attrs.hasMore()){
  186. Attributeattr=attrs.next();
  187. if(count==0){
  188. ouDomain.setOuName(attr.get().toString());
  189. }
  190. count++;
  191. }
  192. list.add(ouDomain);
  193. }
  194. }catch(Exceptione){
  195. e.printStackTrace();
  196. }finally{
  197. try{
  198. ctx.close();
  199. }catch(Exceptione){
  200. e.printStackTrace();
  201. }
  202. }
  203. returnlist;
  204. }
  205. /**
  206. *功能:添加用户
  207. *@paramou组织单位:中投证券,销售部门
  208. *@paramdepartment
  209. *@paramrealName真实姓名,如:李伟
  210. *@paramuserName用户名,如:administrator
  211. *@paramuserPwd
  212. *@paramadminUser
  213. *@paramadminPwd
  214. *@return
  215. *
  216. *作者:陈艺武
  217. *日期:Apr12,2010
  218. */
  219. publicbooleanaddUser(Stringou,Stringdepartment,StringrealName,StringuserName,StringadminUser,StringadminPwd){
  220. PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
  221. LdapContextctx=null;
  222. try{
  223. ctx=getConnectionFromFool();
  224. Attributesattrs=newBasicAttributes(true);
  225. Attributeobjclass=newBasicAttribute("objectclass");
  226. setObjectclassToAttribute(objclass);
  227. attrs.put(objclass);
  228. attrs.put("sAMAccountName",userName);
  229. attrs.put("cn",realName);
  230. intUF_ACCOUNTDISABLE=0x0002;
  231. intUF_PASSWD_NOTREQD=0x0020;
  232. intUF_NORMAL_ACCOUNT=0x0200;
  233. intUF_PASSWORD_EXPIRED=0x800000;
  234. attrs.put("userAccountControl",Integer.toString(UF_NORMAL_ACCOUNT+UF_PASSWD_NOTREQD+UF_PASSWORD_EXPIRED+UF_ACCOUNTDISABLE));
  235. ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,adminUser+"@"+ldapProperty.getDomain());
  236. ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,adminPwd);
  237. //StringnewUser="CN="+realName+","+cvtOuString(ou)+","+ldapProperty.getDomainDC();
  238. StringnewUser="CN="+realName+","+this.getFullOu(ctx,ou)+","+ldapProperty.getDomainDC();
  239. ctx.createSubcontext(newUser,attrs);
  240. ModificationItem[]mods=newModificationItem[2];
  241. StringnewQuotedPassword="/""+userName+"/"";
  242. byte[]newUnicodePassword=newQuotedPassword.getBytes("UTF-16LE");
  243. mods[0]=newModificationItem(DirContext.REPLACE_ATTRIBUTE,newBasicAttribute("unicodePwd",newUnicodePassword));
  244. mods[1]=newModificationItem(DirContext.REPLACE_ATTRIBUTE,newBasicAttribute("userAccountControl",Integer.toString(UF_NORMAL_ACCOUNT+UF_PASSWORD_EXPIRED)));
  245. ctx.modifyAttributes(newUser,mods);
  246. mods=null;
  247. returntrue;
  248. }catch(NamingExceptione){
  249. e.printStackTrace();
  250. }catch(IOExceptione){
  251. e.printStackTrace();
  252. }finally{
  253. if(ctx!=null){
  254. try{
  255. ctx.close();
  256. }catch(NamingExceptione){
  257. e.printStackTrace();
  258. }
  259. ctx=null;
  260. }
  261. }
  262. returnfalse;
  263. }
  264. /**
  265. *功能:管理员用户初始化用户密码
  266. *@paramsUserName
  267. *@paramsNewPassword
  268. *@return
  269. *
  270. *作者:陈艺武
  271. *日期:Apr13,2010
  272. */
  273. publicbooleanadminChangePassword(StringadminUser,StringadminPwd,StringsUserName){
  274. PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
  275. LdapContextctx=null;
  276. //不能从应用中修改超级管理员密码
  277. if(sUserName!=null&&sUserName.equalsIgnoreCase("administrator"))
  278. returnfalse;
  279. try{
  280. ctx=getConnectionFromFool();
  281. ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,adminUser+"@"+ldapProperty.getDomain());
  282. ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,adminPwd);
  283. ModificationItem[]mods=newModificationItem[1];
  284. StringnewQuotedPassword="/""+sUserName+"< 15074 span style="border:none;background-color:inherit;">/"";
  285. byte[]newUnicodePassword=newQuotedPassword.getBytes("UTF-16LE");
  286. mods[0]=newModificationItem(DirContext.REPLACE_ATTRIBUTE,newBasicAttribute("unicodePwd",newUnicodePassword));
  287. StringcnUser=getUser(ctx,sUserName)+","+ldapProperty.getDomainDC();
  288. ctx.modifyAttributes(cnUser,mods);
  289. returntrue;
  290. }catch(Exceptione){
  291. e.printStackTrace();
  292. }finally{
  293. try{
  294. ctx.close();
  295. }catch(Exceptione){
  296. e.printStackTrace();
  297. }
  298. }
  299. returnfalse;
  300. }
  301. /**
  302. *功能:用户修改密码
  303. *@paramsUserName
  304. *@paramsOldPassword
  305. *@paramsNewPassword
  306. *@return
  307. *
  308. *作者:陈艺武
  309. *日期:Apr9,2010
  310. */
  311. publicbooleanuserChangePassword(StringsUserName,StringsOldPassword,StringsNewPassword){
  312. PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
  313. LdapContextctx=null;
  314. StringuserNameAndDomain=sUserName+"@"+ldapProperty.getDomain();
  315. //不能从应用中修改超级管理员密码
  316. if(sUserName!=null&&sUserName.equalsIgnoreCase("administrator"))
  317. returnfalse;
  318. try{
  319. ctx=getConnectionFromFool();
  320. ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,userNameAndDomain);
  321. ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,sOldPassword);
  322. ModificationItem[]mods=newModificationItem[2];
  323. StringoldQuotedPassword="/""+sOldPassword+"/"";
  324. byte[]oldUnicodePassword=oldQuotedPassword.getBytes("UTF-16LE");
  325. StringnewQuotedPassword="/""+sNewPassword+"/"";
  326. byte[]newUnicodePassword=newQuotedPassword.getBytes("UTF-16LE");
  327. mods[0]=newModificationItem(DirContext.REMOVE_ATTRIBUTE,newBasicAttribute("unicodePwd",oldUnicodePassword));
  328. mods[1]=newModificationItem(DirContext.ADD_ATTRIBUTE,newBasicAttribute("unicodePwd",newUnicodePassword));
  329. StringcnUser=getUser(ctx,sUserName)+","+ldapProperty.getDomainDC();
  330. ctx.modifyAttributes(cnUser,mods);
  331. returntrue;
  332. }catch(Exceptione){
  333. e.printStackTrace();
  334. }finally{
  335. try{
  336. ctx.close();
  337. }catch(Exceptione){
  338. e.printStackTrace();
  339. }
  340. }
  341. returnfalse;
  342. }
  343. /**
  344. *功能:修改用户信息
  345. *@paramattrs
  346. *@paramuserDN
  347. *@return
  348. *
  349. *作者:陈艺武
  350. *日期:Apr12,2010
  351. */
  352. publicbooleanmodify(Attributesattrs,StringuserDN){
  353. LdapContextctx=null;
  354. try{
  355. ctx=getConnectionFromFool();
  356. attrs.remove(key_index);
  357. ctx.modifyAttributes(userDN,DirContext.REPLACE_ATTRIBUTE,attrs);
  358. returntrue;
  359. }catch(NamingExceptione){
  360. System.err.println("Problemchangingpassword:"+e);
  361. }catch(Exceptione){
  362. System.err.println("Problem:"+e);
  363. }finally{
  364. try{
  365. ctx.close();
  366. }catch(Exceptione){
  367. e.printStackTrace();
  368. }
  369. }
  370. returnfalse;
  371. }
  372. /**
  373. *功能:删除用户
  374. *@paramadminUser
  375. *@paramadminPwd
  376. *@paramuserDN用户登陆名
  377. *@return
  378. *
  379. *作者:陈艺武
  380. *日期:Apr12,2010
  381. */
  382. publicbooleandel(StringadminUser,StringadminPwd,StringuserName){
  383. PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
  384. LdapContextctx=null;
  385. try{
  386. ctx=getConnectionFromFool();
  387. ctx.addToEnvironment(Context.SECURITY_PRINCIPAL,adminUser+"@"+ldapProperty.getDomain());
  388. ctx.addToEnvironment(Context.SECURITY_CREDENTIALS,adminPwd);
  389. StringadUser=getUser(ctx,userName)+","+ldapProperty.getDomainDC();
  390. ctx.destroySubcontext(adUser);
  391. returntrue;
  392. }catch(NamingExceptione){
  393. System.err.println("Problemchangingpassword:"+e);
  394. }catch(Exceptione){
  395. System.err.println("Problem:"+e);
  396. }finally{
  397. try{
  398. ctx.close();
  399. }catch(Exceptione){
  400. e.printStackTrace();
  401. }
  402. }
  403. returnfalse;
  404. }
  405. privatevoidsetObjectclassToAttribute(Attributeobjclass){
  406. objclass.add("top");
  407. objclass.add("person");
  408. objclass.add("organizationalPerson");
  409. objclass.add("inetorgperson");
  410. }
  411. privateStringgetUser(LdapContextctx,Stringusr){
  412. StringuserName="";
  413. Stringfilter="sAMAccountName="+usr;
  414. SearchResultsi=getSearchResult(ctx,filter);
  415. if(si!=null)
  416. userName=si.getName();
  417. returnuserName;
  418. }
  419. privateStringgetFullOu(LdapContextctx,Stringou){
  420. StringuserName="";
  421. Stringfilter="(&(objectClass=organizationalUnit)(name="+ou+"))";
  422. SearchResultsi=getSearchResult(ctx,filter);
  423. if(si!=null)
  424. userName=si.getName();
  425. returnuserName;
  426. }
  427. privateSearchResultgetSearchResult(LdapContextctx,Stringfilter){
  428. SearchResultsi=null;
  429. PropertyItemldapProperty=(PropertyItem)AdProperties.getInstance().getPropertyItem().get(0);
  430. try{
  431. SearchControlsconstraints=newSearchControls();
  432. co<mce:scripttype="text/javascript"src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:scripttype="text/javascript"src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>nstraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
  433. NamingEnumerationen=ctx.search(ldapProperty.getDomainDC(),filter,constraints);//查询所有用户
  434. while(en!=null&&en.hasMoreElements()){
  435. Objectobj=en.nextElement();
  436. if(objinstanceofSearchResult){
  437. si=(SearchResult)obj;
  438. break;
  439. }
  440. }
  441. }catch(NamingExceptionex){
  442. ex.printStackTrace();
  443. }
  444. returnsi;
  445. }
  446. }
  447. classLdapADManagerControlimplementsControl{
  448. publicbyte[]getEncodedValue(){
  449. returnnull;
  450. }
  451. publicStringgetID(){
  452. return"1.2.840.113556.1.4.1781";
  453. }
  454. publicbooleanisCritical(){
  455. returntrue;
  456. }
  457. }

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐