ldap.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. <form action="/_api/admin/security/passport-ldap" method="post" class="form-horizontal" id="ldapSetting" role="form">
  2. <fieldset>
  3. <legend>LDAP Configuration</legend>
  4. {% set nameForIsLdapEnabled = "settingForm[security:passport-ldap:isEnabled]" %}
  5. {% set isLdapEnabled = settingForm['security:passport-ldap:isEnabled'] %}
  6. <div class="form-group">
  7. <label for="{{nameForIsLdapEnabled}}" class="col-xs-3 control-label">Use LDAP</label>
  8. <div class="col-xs-6">
  9. <div class="btn-group btn-toggle" data-toggle="buttons">
  10. <label class="btn btn-default btn-rounded btn-outline {% if isLdapEnabled %}active{% endif %}" data-active-class="primary">
  11. <input name="{{nameForIsLdapEnabled}}" value="true" type="radio"
  12. {% if true === isLdapEnabled %}checked{% endif %}> ON
  13. </label>
  14. <label class="btn btn-default btn-rounded btn-outline {% if !isLdapEnabled %}active{% endif %}" data-active-class="default">
  15. <input name="{{nameForIsLdapEnabled}}" value="false" type="radio"
  16. {% if !isLdapEnabled %}checked{% endif %}> OFF
  17. </label>
  18. </div>
  19. </div>
  20. </div>
  21. <div class="passport-ldap-hide-when-disabled" {%if !isLdapEnabled %}style="display: none;"{% endif %}>
  22. <div class="form-group">
  23. <label for="settingForm[security:passport-ldap:serverUrl]" class="col-xs-3 control-label">Server URL</label>
  24. <div class="col-xs-6">
  25. <input class="form-control" type="text"
  26. name="settingForm[security:passport-ldap:serverUrl]" value="{{ settingForm['security:passport-ldap:serverUrl'] || '' }}">
  27. <p class="help-block">
  28. <small>
  29. The LDAP URL of the directory service in the format <code>ldap://host:port/DN</code> or <code>ldaps://host:port/DN</code>.<br>
  30. Example: <code>ldaps://ldap.company.com/ou=people,dc=company,dc=com</code>
  31. </small>
  32. </p>
  33. </div>
  34. </div>
  35. {% set nameForIsUserBind = "settingForm[security:passport-ldap:isUserBind]" %}
  36. {% set isUserBind = settingForm['security:passport-ldap:isUserBind'] %}
  37. <div class="form-group">
  38. <label for="{{nameForIsUserBind}}" class="col-xs-3 control-label">Binding Mode</label>
  39. <div class="col-xs-6">
  40. <div class="btn-group btn-toggle" data-toggle="buttons">
  41. <label class="btn btn-default btn-rounded btn-outline {% if !isUserBind %}active{% endif %}" data-active-class="primary">
  42. <input name="{{nameForIsUserBind}}" value="false" type="radio"
  43. {% if !isUserBind %}checked{% endif %}> Manager Bind
  44. </label>
  45. <label class="btn btn-default btn-rounded btn-outline {% if isUserBind %}active{% endif %}" data-active-class="primary">
  46. <input name="{{nameForIsUserBind}}" value="true" type="radio"
  47. {% if isUserBind %}checked{% endif %}> User Bind
  48. </label>
  49. </div>
  50. </div>
  51. </div>
  52. <div class="form-group">
  53. <label for="settingForm[security:passport-ldap:bindDN]" class="col-xs-3 control-label">Bind DN</label>
  54. <div class="col-xs-6">
  55. <input class="form-control" type="text"
  56. name="settingForm[security:passport-ldap:bindDN]" value="{{ settingForm['security:passport-ldap:bindDN'] || '' }}">
  57. <p class="help-block passport-ldap-managerbind" {% if isUserBind %}style="display: none;"{% endif %}>
  58. <small>
  59. The DN of the account that authenticates and queries the directory service
  60. </small>
  61. </p>
  62. <p class="help-block passport-ldap-userbind" {% if !isUserBind %}style="display: none;"{% endif %}>
  63. <small>
  64. The query used to bind with the directory service.<br>
  65. Use <code>{% raw %}{{username}}{% endraw %}</code> to reference the username entered in the login page.<br>
  66. Example: <code>uid={% raw %}{{username}}{% endraw %},dc=domain,dc=com</code><br>
  67. </small>
  68. </p>
  69. </div>
  70. </div>
  71. <div class="form-group">
  72. <label for="settingForm[security:passport-ldap:bindDNPassword]" class="col-xs-3 control-label">Bind DN Password</label>
  73. <div class="col-xs-6">
  74. <input class="form-control passport-ldap-managerbind" type="text" {% if isUserBind %}style="display: none;"{% endif %}
  75. name="settingForm[security:passport-ldap:bindDNPassword]" value="{{ settingForm['security:passport-ldap:bindDNPassword'] || '' }}">
  76. <p class="help-block passport-ldap-managerbind">
  77. <small>
  78. The password for the Bind DN account.
  79. </small>
  80. </p>
  81. <p class="help-block passport-ldap-userbind" {% if !isUserBind %}style="display: none;"{% endif %}>
  82. <small>
  83. The password that is entered in the login page will be used to bind.
  84. </small>
  85. </p>
  86. </div>
  87. </div>
  88. <div class="form-group">
  89. <label for="settingForm[security:passport-ldap:searchFilter]" class="col-xs-3 control-label">Search Filter</label>
  90. <div class="col-xs-6">
  91. <input class="form-control" type="text" placeholder="Default: (uid={% raw %}{{username}}{% endraw %})"
  92. name="settingForm[security:passport-ldap:searchFilter]" value="{{ settingForm['security:passport-ldap:searchFilter'] || '' }}">
  93. <p class="help-block">
  94. <small>
  95. The query used to locate the authenticated user.<br>
  96. Use <code>{% raw %}{{username}}{% endraw %}</code> to reference the username entered in the login page.<br>
  97. If empty, the filter <code>(uid={% raw %}{{username}}{% endraw %})</code> is used.<br>
  98. <br>
  99. Example to match with 'uid' or 'mail': <code>(|(uid={% raw %}{{username}}{% endraw %})(mail={% raw %}{{username}}{% endraw %}))</code>
  100. </small>
  101. </p>
  102. </div>
  103. </div>
  104. <h4>Attribute Mapping (Optional)</h4>
  105. <div class="form-group">
  106. <label for="settingForm[security:passport-ldap:attrMapUsername]" class="col-xs-3 control-label">username</label>
  107. <div class="col-xs-6">
  108. <input class="form-control" type="text" placeholder="Default: uid"
  109. name="settingForm[security:passport-ldap:attrMapUsername]" value="{{ settingForm['security:passport-ldap:attrMapUsername'] || '' }}">
  110. <p class="help-block">
  111. <small>
  112. Specification of mappings when creating new users
  113. </small>
  114. </p>
  115. </div>
  116. </div>
  117. <h4>Group Search Filter (Optional)</h4>
  118. <div class="form-group">
  119. <label for="settingForm[security:passport-ldap:groupSearchBase]" class="col-xs-3 control-label">Group Search Base DN</label>
  120. <div class="col-xs-6">
  121. <input class="form-control" type="text"
  122. name="settingForm[security:passport-ldap:groupSearchBase]" value="{{ settingForm['security:passport-ldap:groupSearchBase'] || '' }}">
  123. <p class="help-block">
  124. <small>
  125. The base DN from which to search for groups. If defined, also <code>Group Search Filter</code> must be defined for the search to work.<br>
  126. Example: <code>ou=groups,dc=domain,dc=com</code><br>
  127. </small>
  128. </p>
  129. </div>
  130. </div>
  131. <div class="form-group">
  132. <label for="settingForm[security:passport-ldap:groupSearchFilter]" class="col-xs-3 control-label">Group Search Filter</label>
  133. <div class="col-xs-6">
  134. <input class="form-control" type="text"
  135. name="settingForm[security:passport-ldap:groupSearchFilter]" value="{{ settingForm['security:passport-ldap:groupSearchFilter'] || '' }}">
  136. <p class="help-block">
  137. <small>
  138. The query used to filter for groups.<br>
  139. Use <code>{% raw %}{{dn}}{% endraw %}</code> to have it replaced of the found user object.<br>
  140. <br>
  141. Example: <code>(&(cn=group1)(memberUid={% raw %}{{dn}}{% endraw %}))</code> hits the groups
  142. which has <code>cn=group1</code> and <code>memberUid</code> includes the user's <code>uid</code>
  143. (when <code>Group DN Property</code> is not changed from the default value.)
  144. </small>
  145. </p>
  146. </div>
  147. </div>
  148. <div class="form-group">
  149. <label for="settingForm[security:passport-ldap:groupSearchFilter]" class="col-xs-3 control-label">Group DN Property</label>
  150. <div class="col-xs-6">
  151. <input class="form-control" type="text" placeholder="Default: uid"
  152. name="settingForm[security:passport-ldap:groupDnProperty]" value="{{ settingForm['security:passport-ldap:groupDnProperty'] || '' }}">
  153. <p class="help-block">
  154. <small>
  155. The property of user object to use in <code>{% raw %}{{dn}}{% endraw %}</code> interpolation of <code>Group Search Filter</code>.
  156. </small>
  157. </p>
  158. </div>
  159. </div>
  160. </div><!-- /.passport-ldap-configurations -->
  161. <div class="form-group">
  162. <div class="col-xs-offset-3 col-xs-6">
  163. <button type="submit" class="btn btn-primary">{# the first element is the default button to submit #}
  164. {{ t('Update') }}
  165. </button>
  166. <button type="button"
  167. class="btn btn-default passport-ldap-hide-when-disabled"
  168. data-target="#test-ldap-account" data-toggle="modal"
  169. {%if !isLdapEnabled %}style="display: none;"{% endif %}>
  170. Test Saved Configuration
  171. </button>
  172. </div>
  173. </div>
  174. </fieldset>
  175. <input type="hidden" name="_csrf" value="{{ csrf() }}">
  176. <script>
  177. // switch display according to on / off of radio buttons
  178. $('input[name="{{nameForIsLdapEnabled}}"]:radio').change(function() {
  179. const isEnabled = ($(this).val() === "true");
  180. if (isEnabled) {
  181. $('.passport-ldap-hide-when-disabled').show(400);
  182. }
  183. else {
  184. $('.passport-ldap-hide-when-disabled').hide(400);
  185. }
  186. });
  187. // switch display according to on / off of radio buttons
  188. $('input[name="{{nameForIsUserBind}}"]:radio').change(function() {
  189. const isUserBind = ($(this).val() === "true");
  190. if (isUserBind) {
  191. $('input.passport-ldap-managerbind').hide();
  192. $('.help-block.passport-ldap-managerbind').hide();
  193. $('.help-block.passport-ldap-userbind').show();
  194. }
  195. else {
  196. $('input.passport-ldap-managerbind').show();
  197. $('.help-block.passport-ldap-managerbind').show();
  198. $('.help-block.passport-ldap-userbind').hide();
  199. }
  200. });
  201. // store which button is clicked when submit
  202. var submittedButton;
  203. $('button[type="submit"]').click(function() {
  204. submittedButton = $(this);
  205. });
  206. $('#ldapSetting, #ldapTest').each(function() {
  207. $(this).submit(function()
  208. {
  209. function showMessage(formId, msg, status) {
  210. $('#' + formId + ' .alert').remove();
  211. if (!status) {
  212. status = 'success';
  213. }
  214. var $message = $('<p class="alert"></p>');
  215. $message.addClass('alert-' + status);
  216. $message.html(msg.replace('\n', '<br>'));
  217. $message.insertAfter('#' + formId + ' legend');
  218. if (status == 'success') {
  219. setTimeout(function()
  220. {
  221. $message.fadeOut({
  222. complete: function() {
  223. $message.remove();
  224. }
  225. });
  226. }, 5000);
  227. }
  228. }
  229. var $form = $(this);
  230. var $id = $form.attr('id');
  231. var $button = submittedButton;
  232. var $action = $button.attr('formaction') || $form.attr('action');
  233. $button.attr('disabled', 'disabled');
  234. var jqxhr = $.post($action, $form.serialize(), function(data)
  235. {
  236. if (data.status) {
  237. const message = data.message || '更新しました';
  238. showMessage($id, message);
  239. } else {
  240. showMessage($id, data.message, 'danger');
  241. }
  242. })
  243. .fail(function() {
  244. showMessage($id, 'エラーが発生しました', 'danger');
  245. })
  246. .always(function() {
  247. $button.prop('disabled', false);
  248. });
  249. return false;
  250. });
  251. });
  252. </script>
  253. </form>
  254. <div class="modal test-ldap-account" id="test-ldap-account">
  255. <div class="modal-dialog">
  256. <div class="modal-content">
  257. <div class="modal-header">
  258. <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  259. <div class="modal-title">{{ t('Test LDAP Account') }}</div>
  260. </div>
  261. <div class="modal-body">
  262. {% include '../../../widget/passport/ldap-association-tester.html' %}
  263. </div><!-- /.modal-body -->
  264. </div><!-- /.modal-content -->
  265. </div><!-- /.modal-dialog -->
  266. <script>
  267. /**
  268. * associate (submit the form)
  269. */
  270. function associateLdap() {
  271. var $form = $('#formLdapAssociationContainer > form');
  272. var $action = '/me/external-accounts/associateLdap';
  273. $form.attr('action', $action);
  274. $form.submit();
  275. }
  276. </script>
  277. </div><!-- /.modal -->