Назад | Перейти на главную страницу

Apache, SVN и Active Directory: как избежать дублирования конфигурации?

Я пытаюсь связать SVN, размещенный на Apache на Windows Server 2008, с Active Directory.

Я понял, что мне нужно сделать для управления группами пользователей на уровне репозитория:

<Location "/SampleRepository1">
  DAV svn
  SVNPath H:/Repositories/SampleDirectory1
  AuthBasicProvider ldap
  AuthzLDAPAuthoritative Off
  AuthLDAPURL "ldap://.../DC=...,DC=com?sAMAccountName?sub?(objectClass=*)" none
  AuthLDAPBindDN "CN=Subversion,OU=Subversion,DC=...,DC=com"
  AuthLDAPBindPassword "..."
  AuthType Basic
  AuthName "Use your sAMAccountName to connect. If you're unsure, write to contact@...com."
  require ldap-group CN=Subversion OpenSource Contributors,OU=Subversion,DC=...,DC=com
  require ldap-group CN=Subversion Administrators,OU=Subversion,DC=...,DC=com
</location>

<Location "/SampleRepository2">
  DAV svn
  SVNPath H:/Repositories/SampleDirectory2
  AuthBasicProvider ldap
  AuthzLDAPAuthoritative Off
  AuthLDAPURL "ldap://.../DC=...,DC=com?sAMAccountName?sub?(objectClass=*)" none
  AuthLDAPBindDN "CN=Subversion,OU=Subversion,DC=...,DC=com"
  AuthLDAPBindPassword "..."
  AuthType Basic
  AuthName "Use your sAMAccountName to connect. If you're unsure, write to contact@...com."
  require ldap-group CN=Subversion Administrators,OU=Subversion,DC=...,DC=com
</location>

Что меня беспокоит, так это то, что слишком много дублирования: если SVNPath и ldap-groups переход из репозитория в репозиторий, все остальное остается прежним.

Как избежать дублирования кода при авторизации некоторых репозиториев для разных групп?

Ваши опасения связаны с просмотром конфигурации Apache как кода; это не так. Вы сведете себя с ума, если подумаете об этом с этой точки зрения.

Нет никакой логической структуры, только некоторые рудиментарные условные конструкции для определенных отдельных команд, и почти нет манипуляций с переменными. Все вещи, которые позволяют языку программирования дать вам возможность избежать дублирования кода и улучшить логику, просто отсутствуют по замыслу; В конце концов, это всего лишь файл конфигурации - некоторые утверждают, что он слишком гибкий (и, следовательно, слишком простой, чтобы превратить конфигурацию в огромный бессмысленный беспорядок) как таковой.

Тем не менее, вы можете уменьшить большую часть имеющейся у вас конфигурации, просто применив некоторые из ваших директив к родительскому элементу этого URL-пути; предполагая, что вы можете безопасно применять эти директивы к /, и что эти директивы применяются ко всем репозиториям в системе:

<Location "/">
  DAV svn
  AuthBasicProvider ldap
  AuthzLDAPAuthoritative Off
  AuthLDAPURL "ldap://.../DC=...,DC=com?sAMAccountName?sub?(objectClass=*)" none
  AuthLDAPBindDN "CN=Subversion,OU=Subversion,DC=...,DC=com"
  AuthLDAPBindPassword "..."
  AuthType Basic
  AuthName "Use your sAMAccountName to connect. If you're unsure, write to contact@...com."
</Location>

<Location "/SampleRepository1">
  SVNPath H:/Repositories/SampleDirectory1
  require ldap-group CN=Subversion OpenSource Contributors,OU=Subversion,DC=...,DC=com
  require ldap-group CN=Subversion Administrators,OU=Subversion,DC=...,DC=com
</Location>

<Location "/SampleRepository2">
  SVNPath H:/Repositories/SampleDirectory2
  require ldap-group CN=Subversion Administrators,OU=Subversion,DC=...,DC=com
</Location>

Все <Location> блоки, соответствующие запросу, будут применять к нему свои директивы (в том порядке, в котором они находятся в файле), что означает, что вы можете разделить большую часть общей конфигурации на соответствующий родительский путь.