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

Как ограничить доступ только к дочернему каталогу SVN?

Я пытаюсь настроить разрешения для репозитория 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.

С другой стороны, делать:

извлекает все дерево каталогов, включая 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:

  1. <Location /demo> указывает на файл доступа:

    <Location /demo>
        ...
        AuthzSVNAccessFile /etc/subversion/access.conf
        ...
    </Location>
    
  2. Файл доступа определяет, кто может получить доступ к определенным файлам и каталогам. Базовый пример:

    [/]
    * = 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.