Я пытаюсь настроить разрешения для репозитория SVN, доступ к которому осуществляется через Apache 2. Я хочу, чтобы любой мог получить доступ к корневому каталогу, ограничивая при этом для аутентифицированных пользователей дочерний каталог. Пример:
/demo
/demo/project1
/demo/project1/sensitive-data # This path should require user authentication.
/demo/project2
Сначала я подумал, что это очень просто:
<Location /demo>
DAV svn
SVNPath /home/svn/demo
AuthType Basic
AuthName demo
AuthUserFile /etc/subversion/passwd
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
<Location /demo/project1/sensitive-data>
DAV svn
Require valid-user
</Location>
При использовании через HTTP (например, с CURL) Apache соответствует конфигурации: я могу получить доступ:
и я получаю, как и ожидалось, HTTP 401 Unauthorized
при попытке получить http://example.com/demo/project1/sensitive-data.
С другой стороны, делать:
svn checkout http://example.com/demo/ .
или:svn checkout http://example.com/demo/project1/ .
извлекает все дерево каталогов, включая demo/project1/sensitive-data
.
По крайней мере, svn checkout http://example.com/demo/project1/sensitive-data/ .
запрашивает пароль.
Как мне настроить разрешения, чтобы ограничить доступ к sensitive-data
каталог при выполнении svn checkout http://example.com/demo/ .
?
В <Location /demo/project1/sensitive-data>
блок не имеет значения при оформлении заказа: он используется только при доступе http://example.com/demo/project1/sensitive-data напрямую, поэтому HTTP-запросы приводят к HTTP 401 Unauthorized
и проверка этого конкретного каталога требует аутентификации.
Правильный способ настройки авторизации на основе пути: объяснено в документации по Subversion:
<Location /demo>
указывает на файл доступа:
<Location /demo>
...
AuthzSVNAccessFile /etc/subversion/access.conf
...
</Location>
Файл доступа определяет, кто может получить доступ к определенным файлам и каталогам. Базовый пример:
[/]
* = r # Everyone should be able to access the repository.
[/demo/project1/sensitive-data] # Note that there is no trailing slash.
* = # Nobody should access the sensitive directory.