Apache 2.4环境下SVN仓库按项目级配置LDAP授权的问题
Apache 2.4环境下SVN仓库按项目级配置LDAP授权的问题
看起来你遇到的是Apache 2.4授权规则叠加导致的典型问题,我来帮你理清楚原因和解决办法:
问题根源
Apache 2.4的授权逻辑默认是RequireAll模式——当多个<Location>块的规则匹配到同一个请求路径时,所有的Require条件必须同时满足。你给/svn/Client1/设置了Require ldap-group cn=client1,dc=company,dc=com,又给/svn/Client1/Project17/加了Require ldap-user cn=adam,这时候请求子路径时,Apache会要求用户同时属于client1组并且是adam用户,但adam不在这个组里,自然就授权失败了。
解决方案一:覆盖子路径的授权规则
你可以在Project17的<Location>块里明确取消上层的RequireAll强制要求,只保留针对adam的授权规则:
<Location /svn/Client1/Project17/> # 取消上层的RequireAll逻辑,避免叠加检查 RequireAll None # 仅允许adam用户访问该路径 Require ldap-user cn=adam </Location>
把这个配置块放在原来的/svn/Client1/配置块之后(Apache本身是最长路径匹配优先,顺序影响不大,但放后面更直观),重启Apache即可生效。
解决方案二:用SVN authz文件做细粒度权限控制(更推荐)
如果以后还有更多复杂的路径权限需求,用Apache Location块会越来越繁琐,建议结合SVN自带的authz文件来管理:
- 修改原有的
/svn/Client1/配置块,添加authz文件关联:
<Location /svn/Client1/> DAV svn SVNPATH /home/svn/Client1 Options -Indexes AuthType Basic AuthName "Company SVN" AuthBasicProvider ldap AuthLDAPBindDN "cn=binduser,dc=company,dc=com" AuthLDAPBindPassword "binduserpassword" AuthLDAPURL "ldap://ldap.company.com:389/ou=users,dc=company,dc=com?cn?sub?(objectClass=posixAccount)" AuthLDAPGroupAttributeIsDN on AuthLDAPGroupAttribute member # 启用SVN authz权限文件 AuthzSVNAccessFile /etc/apache2/svn-authz-client1 # 先通过LDAP认证,再用authz做路径权限检查 Require valid-user </Location>
- 创建
/etc/apache2/svn-authz-client1文件,配置路径级权限:
[groups] # 映射LDAP组到authz组 client1_team = cn=client1,dc=company,dc=com # 整个Client1仓库的默认权限 [/] @client1_team = rw # Project17的单独权限 [Project17:/] cn=adam = rw
这种方式可以灵活配置不同路径的用户/组权限,后续维护起来更方便。
最后别忘了重启Apache生效:
sudo service apache2 restart
备注:内容来源于stack exchange,提问作者Hussain Akbar
相关产品推荐
相关产品推荐

