mock平台

ldap.js 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. const ldap = require('ldapjs');
  2. const yapi = require('../yapi.js');
  3. const util = require('util');
  4. exports.ldapQuery = (username, password) => {
  5. // const deferred = Q.defer();
  6. return new Promise((resolve, reject) => {
  7. const { ldapLogin } = yapi.WEBCONFIG;
  8. // 使用ldapjs库创建一个LDAP客户端
  9. const client = ldap.createClient({
  10. url: ldapLogin.server
  11. });
  12. client.once('error', err => {
  13. if (err) {
  14. let msg = {
  15. type: false,
  16. message: `once: ${err}`
  17. };
  18. reject(msg);
  19. }
  20. });
  21. // 注册事件处理函数
  22. const ldapSearch = (err, search) => {
  23. const users = [];
  24. if (err) {
  25. let msg = {
  26. type: false,
  27. message: `ldapSearch: ${err}`
  28. };
  29. reject(msg);
  30. }
  31. // 查询结果事件响应
  32. search.on('searchEntry', entry => {
  33. if (entry) {
  34. // 获取查询对象
  35. users.push(entry.object);
  36. }
  37. });
  38. // 查询错误事件
  39. search.on('error', e => {
  40. if (e) {
  41. let msg = {
  42. type: false,
  43. message: `searchErr: ${e}`
  44. };
  45. reject(msg);
  46. }
  47. });
  48. search.on('searchReference', referral => {
  49. // if (referral) {
  50. // let msg = {
  51. // type: false,
  52. // message: `searchReference: ${referral}`
  53. // };
  54. // reject(msg);
  55. // }
  56. console.log('referral: ' + referral.uris.join());
  57. });
  58. // 查询结束
  59. search.on('end', () => {
  60. if (users.length > 0) {
  61. client.bind(users[0].dn, password, e => {
  62. if (e) {
  63. let msg = {
  64. type: false,
  65. message: `用户名或密码不正确: ${e}`
  66. };
  67. reject(msg);
  68. } else {
  69. let msg = {
  70. type: true,
  71. message: `验证成功`,
  72. info: users[0]
  73. };
  74. resolve(msg);
  75. }
  76. client.unbind();
  77. });
  78. } else {
  79. let msg = {
  80. type: false,
  81. message: `用户名不存在`
  82. };
  83. reject(msg);
  84. client.unbind();
  85. }
  86. });
  87. };
  88. // 将client绑定LDAP Server
  89. // 第一个参数: 是用户,必须是从根结点到用户节点的全路径
  90. // 第二个参数: 用户密码
  91. return new Promise((resolve, reject) => {
  92. if (ldapLogin.bindPassword) {
  93. client.bind(ldapLogin.baseDn, ldapLogin.bindPassword, err => {
  94. if (err) {
  95. let msg = {
  96. type: false,
  97. message: `LDAP server绑定失败: ${err}`
  98. };
  99. reject(msg);
  100. }
  101. resolve();
  102. });
  103. } else {
  104. resolve();
  105. }
  106. }).then(() => {
  107. const searchDn = ldapLogin.searchDn;
  108. const searchStandard = ldapLogin.searchStandard;
  109. // 处理可以自定义filter
  110. let customFilter;
  111. if (/^&/gi.test(searchStandard)) {
  112. customFilter = util.format(searchStandard, username);
  113. } else {
  114. customFilter = `${searchStandard}=${username}`;
  115. }
  116. const opts = {
  117. // filter: `(${searchStandard}=${username})`,
  118. filter: `(${customFilter})`,
  119. scope: 'sub'
  120. };
  121. // 开始查询
  122. // 第一个参数: 查询基础路径,代表在查询用户信息将在这个路径下进行,该路径由根结点开始
  123. // 第二个参数: 查询选项
  124. client.search(searchDn, opts, ldapSearch);
  125. });
  126. });
  127. };