【问题标题】:SVN authentication with mod_authn_dbd works but other svn users can see other repositories使用 mod_authn_dbd 的 SVN 身份验证有效,但其他 svn 用户可以看到其他存储库
【发布时间】:2015-03-18 16:09:54
【问题描述】:

正如标题已经说的那样,SVN 身份验证适用于 mod_authn_dbd 和 MySQL,但如果我使用 /repos/testrepo 的凭据登录,我可以切换到 /repos/{any-other-existing-repo}浏览器并在成功登录后查看其他存储库。我的配置有什么问题?

Apache2 虚拟主机:

DBDriver mysql
DBDParams "host=127.0.0.1 port=3306 dbname=svndb user=svnuser pass=svnpass"
DBDMin 1
DBDKeep 8
DBDMax 20
DBDExptime 200

<Location /repos>
  DAV svn
  SVNParentPath /var/www/svn/repos/

  AuthType Basic
  AuthName "SVN Repository"
  AuthBasicProvider dbd
  AuthDBDUserPWQuery "SELECT password FROM users WHERE user = %s"
  Require valid-user
</Location>

MySQL 数据库:

"svndb.users"
  id (int)
  user (varchar)
  password (varchar)

【问题讨论】:

    标签: svn apache2 virtualhost


    【解决方案1】:

    有两种方法可以解决这个问题。第一个是将 SVNParentPath 指令更改为 SVNPath,并且只指向您的 /var/www/svn/repos/testrepo。另一个解决方案是启用 authz_svn_module(每个目录访问控制)并使用 AuthzSVNAccessFile 指令添加授权文件。您的配置允许访问 /var/www/svn/repos 路径下的所有存储库的原因是因为 SVNParentPath 共享子目录。这是来自 SVNParentPath 文档:

    指定父目录在文件系统中的位置 子目录是 Subversion 存储库。在一个配置中 用于 Subversion 存储库的块,此指令或 SVNPath 必须存在,但不能同时存在。

    解决方案 1:

    ...
    <Location /repos>
      DAV svn
      SVNPath /var/www/svn/repos/testrepo
    
      AuthType Basic
      AuthName "SVN Repository"
      AuthBasicProvider dbd
      AuthDBDUserPWQuery "SELECT password FROM users WHERE user = %s"
      Require valid-user
    </Location>
    

    解决方案 2:

    ...
    <Location /repos>
      DAV svn
      SVNParentPath /var/www/svn/repos/
      AuthzSVNAccessFile /path/to/access-file.txt
    
      AuthType Basic
      AuthName "SVN Repository"
      AuthBasicProvider dbd
      AuthDBDUserPWQuery "SELECT password FROM users WHERE user = %s"
      Require valid-user
    </Location>
    
    ====== access-file.txt ======
    
    [groups]
    admins = joe, kee
    developers = marry
    deployers = build
    
    [testrepo:/]
    @admins = rw
    @deployers = r
    @developers = rw
    
    [someotherrepo:/]
    @admins = rw
    @developers =
    @deployers =
    zack = rw
    

    【讨论】:

    • 有没有办法通过 SVNParentPath 保持 MySQL 身份验证?例如在限制部分使用 Require 指令?我不想为每个用户创建条目。我还想为用户提供密码更改自助服务...
    • 您可以保持现在的样子。基本 HTTP 身份验证与 SVN 模块没有任何关系。我只是认为没有一种干净的方法可以在数据库中保持授权。一种解决方案是拥有一个包含授权数据的表结构,然后定期将其转储到文件系统。
    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多