匿名SVN Checkout,但验证提交

时间:2012-12-25 08:58:19

标签: svn apache mod-auth

我正在使用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内部服务器错误。

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

5 个答案:

答案 0 :(得分:6)

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

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

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

在你的情况下,它应该看起来像这样(我只是稍微修改了你发布的配置,假设除了强制登录问题之外它是正确的(我没有LDAP服务器来测试它)。注意替换{{1在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指令之间的任何位置。

答案 1 :(得分:3)

确定。我完成了第一部分。

参考6. Access control lists部分here,我在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'

答案 2 :(得分:2)

我见过的每个Subversion服务器:

  • 允许匿名结帐但不提交。
  • 需要经过身份验证的结帐并允许提交。

我认为Subversion提交过程必须是。

  • 接收身份验证凭据。
  • 带身份验证的结帐代码。
  • 重新申请更改。
  • 提交更改。

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

只是一些注释

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