У меня есть несколько репозиториев Subversion, которые обслуживаются через Apache 2.2 и WebDAV. Все они расположены в центре, и я использовал это debian-administration.org в качестве основы (я отказался от использования аутентификации базы данных для простого файла htpasswd).
С тех пор я также начал использовать WebSVN. Моя проблема в том, что не все пользователи в системе должны иметь доступ к различным репозиториям, а настройка WebSVN по умолчанию - разрешить любому, кто может пройти аутентификацию.
Согласно документации WebSVN, лучший способ обойти это - использовать систему доступа к путям Subversion, поэтому я попытался создать ее с помощью директивы AuthzSVNAccessFile.
Когда я это делаю, я продолжаю получать сообщения «403 запрещено».
Мои файлы выглядят следующим образом:
У меня есть настройки политики по умолчанию в файле:
<Location /svn/>
DAV svn
SVNParentPath /var/lib/svn/repository
Order deny,allow
Deny from all
</Location>
Каждый репозиторий получает файл политики, как показано ниже:
<Location /svn/sysadmin/>
Include /var/lib/svn/conf/default_auth.conf
AuthName "Repository for sysadmin"
require user joebloggs jimsmith mickmurphy
</Location>
Файл default_auth.conf содержит следующее:
SVNParentPath /var/lib/svn/repository
AuthType basic
AuthUserFile /var/lib/svn/conf/.dav_svn.passwd
AuthzSVNAccessFile /var/lib/svn/conf/svnaccess.conf
Я не совсем уверен, зачем мне второй SVNParentPath в default_auth.conf, но я только что добавил это сегодня, так как получал сообщения об ошибках в результате добавления директивы AuthzSVNAccessFile.
С файлом с полностью разрешенным доступом
[/]
joebloggs = rw
система работала нормально (и практически не изменилась), но как только я начинаю пытаться добавлять какие-либо ограничения, такие как
[sysadmin:/]
joebloggs = rw
вместо этого я снова получаю сообщение об ошибке «В разрешении отказано». Записи файла журнала:
[Thu May 28 10:40:17 2009] [error] [client 89.100.219.180] Access denied: 'joebloggs' GET websvn:/
[Thu May 28 10:40:20 2009] [error] [client 89.100.219.180] Access denied: 'joebloggs' GET svn:/sysadmin
Что мне нужно сделать, чтобы это сработало? Неправильно настроен apache, или я неправильно понимаю файл svnaccess.conf?
Если я иду неверным путем, у меня нет особой привязанности к моему общему подходу, поэтому не стесняйтесь предлагать и альтернативы.
ОБНОВЛЕНИЕ (20090528-1600):
Я попытался реализовать этот ответ, но я все еще не могу заставить его работать должным образом.
Я знаю, что большая часть конфигурации верна, поскольку я добавил
[/]
joebloggs = rw
в начале, а затем у joebloggs есть все необходимые права доступа.
Когда я пытаюсь перейти к конкретному репозиторию, делаю что-то вроде
[/]
joebloggs = rw
[sysadmin:/]
mickmurphy = rw
затем я получил ошибку отказа в разрешении для mickmurphy (joebloggs все еще работает) с ошибкой, аналогичной той, что у меня уже была ранее
[Thu May 28 10:40:20 2009] [error] [client 89.100.219.180] Access denied: 'mickmurphy' GET svn:/sysadmin
Кроме того, я забыл объяснить ранее, что все мои репозитории находятся под
/var/lib/svn/repository
ОБНОВЛЕНИЕ (20090529-1245):
По-прежнему не удается заставить это работать, но все признаки, похоже, указывают на то, что проблема с контролем доступа в Subversion не работает должным образом. Я предполагаю, что я не настроил apache или svn для правильного распознавания структуры моего репозитория.
Это потому, что запись '[/]' работает идеально.
Мне также приходит в голову, что этот вопрос лучше подходит для StackOverflow?
ОБНОВЛЕНИЕ (20090603-1740):
В ответ на один из комментариев к этому вопросу моей настройке WebDAV для самой Subversion указано местоположение / svn /РЕПО но websvn установлен в / websvn.
Вероятно, проблема связана с разделением конфигурации между двумя директивами местоположения, но я не уверен.
Вместо того, чтобы определять разрешения в двух местах (конфигурация apache и файл authz), просто определите их в файле authz. Вот так:
httpd.conf
<Location /svn>
DAV svn
SVNParentPath /var/lib/svn/repository
Require valid-user
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /path/to/.htpasswd
SVNPathAuthz on
AuthzSVNAccessFile /path/to/svn.authz
</Location>
svn.authz
[groups]
sysadmins = joebloggs jimsmith mickmurphy
# By default, nobody has any permissions
[/]
* =
# sysadmins get access to the sysadmin repository
[sysadmin:/]
@sysadmins = rw
Очевидно, вам понадобятся соответствующие пользователи в файле htpasswd.
Понятия не имею, решили ли вы эту проблему, но эта процедура мне подходит.
Забудьте возиться с директивами apache, вместо этого отредактируйте файл config.php WebSVN и включите / раскомментируйте следующую директиву:
$ config-> useAuthenticationFile ('/ путь / к / вашему / authz / файлу');
это работает для меня.
пользователь1 может видеть "/" и "/ проект1" пользователь3 может видеть только "/ проект1"
[группы]
groupa = пользователь1, пользователь2
groupb = user3, user4
[/]
@groupa = rw
[/ project1]
@groupb = rw
Я много с этим боролся, и единственная конфигурация, которая мне подходит, это следующая:
Authz file
------
[groups]
group1=user1
group2=user2
#Read and write for everyone defined in some group, others denied
[/]
@group1=rw
@group2=rw
*=
[project1:/]
@group1=rw
*=
[project2:/]
@group2=r
*=
----end authz file
В результате группа group1 имеет доступ для чтения и записи к проекту project1, а группа group2 имеет доступ для чтения к проекту2. У всех остальных нет доступа ни к каким проектам.
Я должен подчеркнуть, что «проект1» и «проект2» - это проекты внутри репозитория, определенного в файле конфигурации Apache. subversion.conf
так как.
Subversion.conf
----
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /svn>
DAV svn
SVNParentPath /var/www/svn
AuthType Basic
AuthName "Name of the root repositories"
Require valid-user
</Location>
<Location /svn/repos>
AuthName "Subversion subrepository"
AuthUserFile /var/www/svn/repos/conf/passwdfile
#Authz control
AuthzSVNAccessFile /var/www/svn/repos/conf/authz
</Location>
-----end
Моя текущая проблема в том, что невозможно перечислить проекты в репозитории. /svn/repos
вообще (хотя к ним можно нормально получить доступ). SVNListParentPath
по директиве, куда бы вы ее ни положили, это не помогает.
В настоящее время мой /var/www/svn
не репозиторий, а просто каталог в файловой системе сервера. /var/www/svn/repos
это репозиторий, созданный с помощью svnadmin create
Вы бы прочитали документ websvn и все было бы очевидно :)
Также обратите внимание, что вы не должны использовать команду AuthzSVNAccessFile для определения файла доступа.
Теперь, когда вы определили аутентификацию, вам будет предложено ввести имя пользователя и пароль для доступа к каталогу WebSVN. Осталось только настроить WebSVN на использование вашего файла доступа Subversion для управления доступом. Добавьте эту строку в свой файл config.php:
$ config-> useAuthenticationFile ('/ путь / к / файлу доступа');