![根据请求字符串使用 LDAP 动态验证 Apache?](https://linux22.com/image/555266/%E6%A0%B9%E6%8D%AE%E8%AF%B7%E6%B1%82%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%BD%BF%E7%94%A8%20LDAP%20%E5%8A%A8%E6%80%81%E9%AA%8C%E8%AF%81%20Apache%EF%BC%9F.png)
是否可以使用请求 URI 的一部分作为 mod_authnz_ldapRequire ldap-group
指令的输入?
我正在尝试动态检查对一系列不同项目目录的访问,这些目录均位于http://testserver.com/projects/,这样访问的用户/projects/abc
将被检查是否属于cn=abc,ou=groups,dc=test
。理想情况下,我希望这样做,而无需为每个项目创建单独的 Location 指令,因为可能会有数百个项目。
我想出了这个,它说明了一般的概念,但它不起作用(project_name 没有检索实际的变量内容):
<Location /projects>
SetEnvIf Request_URI "/projects/([-a-z0-9A-Z_]+)/" project_name=$1
AuthType Basic
AuthBasicProvider ldap
AuthName "Restricted Resource - SVN (LDAP)"
AuthLDAPURL "ldap://127.0.0.1:389/dc=test?uid"
AuthLDAPGroupAttributeIsDN off
AuthLDAPGroupAttribute memberUid
Require ldap-group cn=%{project_name},ou=groups,dc=test
</Location>
帮助?
答案1
在 Apache 2.4.8 及更高版本中,现在可以实现这一点:
SetEnvIf Request_URI "/projects/([-a-z0-9A-Z_]+)/" project_name=$1
Require ldap-group cn=%{env:project_name}, ou=groups, dc=test
Require
请注意,指令中可能需要空格。请参阅修改 LDAP 服务器文档,尤其是示例 5。
感谢 Buri 为这个老问题找到了答案基于服务器名称的动态组名的 Apache2 ldap 授权。
答案2
我相信 Apache 2.4 在这方面比 2.2 有更多功能...值得一看。
或者,也许值得考虑构建您自己的自定义模块;它并不像看起来那么可怕——假设您对 C 语言很熟悉。
类似地,mod_perl 不是通过钩子提供了很多 Apache 扩展功能吗?
答案3
您可以尝试向 AuthLDAPURL 参数添加过滤器:https://httpd.apache.org/docs/2.4/en/mod/mod_authnz_ldap.html#authldapurl
也许是这样的:
AuthLDAPURL "ldap://127.0.0.1:389/dc=test?uid?sub?(memberof=cn=%{project_name},ou=groups,dc=test)"