6

我正在使用 Httpd 设置 SVN 存储库。目前,我的存储库可通过 Httpd 获得,但任何人都可以签出并提交回来。我想使用 Microsoft Active Directory 身份验证限制提交操作。

我在我的subversion.conf.

<Location /repos>
   DAV svn

   # Directory containing all repository for this path
   SVNParentPath /srv/svn/repositories

   # List repositories colleciton
   SVNListParentPath On

   # Enable WebDAV automatic versioning
   SVNAutoversioning On

   # Repository Display Name
   SVNReposName "RepositoryName"

   # Do basic password authentication in the clear
   AuthType Basic

   # The name of the protected area or "realm"
   AuthName "RepositoryName"

   # Make LDAP the authentication mechanism
   AuthBasicProvider ldap

   # Make LDAP authentication is final
   AuthzLDAPAuthoritative off

   # Active Directory requires an authenticating DN to access records
   #AuthLDAPBindDN "ou=people,o=example,dc=com"

   # The LDAP query URL
   AuthLDAPURL "ldap://example.com:389/DC=com,DC=example,ou=people?uid(objectClass=*)" NONE

   # Read access to everyone
   Satisfy Any

   # Require a valid user
   Require valid-user

   # Authorization file
   AuthzSVNAccessFile /subversion/apache2/auth/repos.acl

   # Limit write permission to list of valid users.
   #<LimitExcept GET PROPFIND OPTIONS REPORT>
      # Require SSL connection for password protection.
      # SSLRequireSSL

      #AuthType Basic
      #AuthName "Authorization Realm"
      #AuthUserFile /etc/httpd/conf/.htpasswd
      #Require valid-user
   #</LimitExcept>
</Location>

使用上述配置,它每次都要求提供凭据。此外,当提供时,存储库是不可访问的。提供正确的凭据后,我收到 500 内部服务器错误。

我确实检查了日志文件,但没有任何内容表明实际原因。

4

5 回答 5

6

为了允许公共阅读/结帐,您需要取消注释<LimitExcept>指令之间的位并注释其上方的单独Require valid-user行。

该指令<LimitExcept GET PROPFIND OPTIONS REPORT>告诉服务器内部的所有内容都不适用于任何GET,或对存储库的请求PROPFIND,这些请求用于签出/读取存储库。换句话说,如果您将这段代码放在您的 Apache 配置中,那么除了上述方法之外,它只需要一个有效用户(例如,如果请求提交,则它需要一个有效用户):OPTIONSREPORTPUT

<LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
</LimitExcept>

在您的情况下,它可能看起来像这样(我只是稍微修改了您发布的配置,假设除了强制登录问题之外这是正确的(我没有用于测试它的 LDAP 服务器)。请注意example.com在您AuthLDAPURL的真实服务器中替换主持人):

<Location /repos>
   DAV svn

   # Directory containing all repository for this path
   SVNParentPath /srv/svn/repositories

   # List repositories colleciton
   SVNListParentPath On

   # Enable WebDAV automatic versioning
   SVNAutoversioning On

   # Repository Display Name
   SVNReposName "RepositoryName"

   # Do basic password authentication in the clear
   AuthType Basic

   # The name of the protected area or "realm"
   AuthName "RepositoryName"

   # Make LDAP the authentication mechanism
   AuthBasicProvider ldap

   # Make LDAP authentication is final
   AuthzLDAPAuthoritative off

   # Active Directory requires an authenticating DN to access records
   #AuthLDAPBindDN "ou=people,o=example,dc=com"

   # The LDAP query URL
   AuthLDAPURL "ldap://example.com:389/DC=com,DC=example,ou=people?uid(objectClass=*)" NONE

   # Authorization file
   AuthzSVNAccessFile /subversion/apache2/auth/repos.acl

   # Limit write permission to list of valid users.
   <LimitExcept GET PROPFIND OPTIONS REPORT>
       SSLRequireSSL
       Require valid-user
   </LimitExcept>
</Location>

只要你把它放在Require valid-user里面LimitExcept,一切都应该按照你的意愿工作。您可以将其余的身份验证配置放在Location指令之间的任何位置。

于 2013-01-02T22:43:36.910 回答
3

行。我完成了第一部分。

参考此处6. Access control lists的部分,我在文件中添加了只读访问权限。AuthzSVNAccessFile

# Authorization file
AuthzSVNAccessFile /srv/svn/repos.acl

/srv/svn/repos.acl文件内容

[/]
* = r

现在,我所有的存储库都可以匿名访问。现在提交部分是剩余的。

现在我在提交时收到以下消息。

Commit failed (details follow):
Server sent unexpected return value (500 Internal Server Error) in response to 
MKACTIVITY request for '/repos/project1/!svn/act/783d45f7-ae05-134d-acb0-f36c007af59d'
于 2012-12-25T09:27:33.620 回答
2

我见过的每个 Subversion 服务器:

  • 允许匿名结帐而无需提交。
  • 需要经过身份验证的签出并允许提交。

我相信 Subversion 提交过程必须如此。

  • 接收身份验证凭据。
  • 带有身份验证的结帐代码。
  • 重新应用更改。
  • 提交更改。
于 2012-12-27T10:14:35.527 回答
2

我建议使用Visual SVN Server。它支持Active Directory。Visual Svn Server 安装 apache 和 svn 二进制文件。它还为 apache 创建了必要的 conf 文件。

使用您想要的功能安装它并检查它创建的 apache 配置文件。如果您可以在 Windows 框中运行,我还建议使用/购买它而不是维护您的 apache 服务器。

于 2012-12-28T11:50:27.773 回答
2

只是一些注意事项

  1. 我从未见过SVNAutoversioning在 Subversion 位置使用过
  2. 阅读 Apache 错误日志可以提供更详细的信息,而不是“500 错误”以防出现问题
  3. 我在这里读到了一些关于 CentOS 上 Subversion 问题的主题,与 Apache 进程的所有者有关(httpd 的某些进程具有不同的所有者,而不是另一个:nobody 和 httpd):检查它ps -au | grep
  4. 提交问题通常与权限不足有关:Apache 进程必须对存储库中的所有文件具有写权限
  5. 最后但同样重要的是,优先级高于第 3-4 页 - 在使用AuthzSVNAccessFile至少一个用户|组的情况下,至少一个路径必须具有写入权限... = rw才能提交。我不知道,如何在 repos.acl 文件中写入继承自 AD 用户名
于 2012-12-28T12:45:08.537 回答