Я пытаюсь связать 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-group
s переход из репозитория в репозиторий, все остальное остается прежним.
Как избежать дублирования кода при авторизации некоторых репозиториев для разных групп?
Ваши опасения связаны с просмотром конфигурации 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>
блоки, соответствующие запросу, будут применять к нему свои директивы (в том порядке, в котором они находятся в файле), что означает, что вы можете разделить большую часть общей конфигурации на соответствующий родительский путь.