我正在为 LDAP 服务器编写 Web 前端 (django)。不同类型的人拥有不同类型的权限,因此我设置了 LDAP ACL 来控制谁可以查看或编辑特定属性。 现在很容易确定特定用户是否具有读取权限 - 尝试读取,您会看到结果。 但是我没有看到一种优雅的方法来区分读取和写入访问权限之前我实际上尝试编写一些更改。也就是我想在界面上说清楚,登录用户是写权限,还是只能读权限。这样用户就不会尝试编辑他们不能编辑的属性。
我唯一想到的就是尝试将某种虚拟对象临时写入属性,看看是否成功。如果是这样,将恢复原始值,并且我知道该用户具有写权限。然后我可以将此属性显示为可编辑。 这样做的问题是,如果服务器在写入虚拟值之后和恢复原始值之前崩溃,我的 LDAP 服务器中就会留下虚拟值。
我需要的是某种查询 ACL 的方法,其方式类似于我可以查询架构定义的方式。但也许这被 LDAP“禁止”了?
有什么想法吗?
艾萨克
最佳答案
ACL,在 openldap 上由 OU 和/或 DN 用正则表达式检查组织
例如:
access to attrs=userPassword
by anonymous auth
by self write
by dn.base="ou=users_with_userPassword_write_access,dc=myproduct,dc=org" write
by dn.exact="cn=manager,dc=myproduct,dc=org" write
by * none
access to *
by dn.exact="cn=manager,dc=myproduct,dc=org" write
by dn.base="ou=users_with_powerfull_write_access,dc=myproduct,dc=org" write
by * none
因此,关于登录用户的 dn(使用 python-ldap 的 whoami_s
),您可以确定用户是否具有某些权限。你不需要测试你是否可以写入数据,在你的 django 应用程序中实现一个检查 DN 的函数。
也许您是说 ACL 是动态生成的?
关于您的评论,如果您的 ACL 是静态的,要了解 ACL,更简单的方法是实现一个实现这些 ACL 的 python 工具。以我之前的例子:
W_ACCESS_OU = "ou=users_with_powerfull_write_access,dc=myproduct,dc=org"
def check_write_access(user_dn):
return is_dn_base(W_ACCESS_OU, user_dn)
现在,python-ldap 无法检索 slapd.conf 的 ACL...而且解析 slapd.conf 是不安全的(因为 slapd.conf 可以在系统的“任何地方”并且 ACL 声明可能是难以解析),而且尝试在 LDAP 后端写入数据会消耗大量时间。
我知道这不是很令人满意。另一种解决方案是使用“服务用户”。只有此用户对 LDAP 后端具有写入权限。
简化了ACL的写法:
access to *
by dn.exact="cn=manager,dc=myproduct,dc=org" write
by * none
然后,对于普通用户,您设置授权标志。 当您登录的用户想要做某事时,您的应用程序会检查该标志。如果此标志为 OK,则服务用户将数据写入后端。
这是我们在我们的一个应用程序上部署的策略。
在这两种情况下,ACL 的检查都是由我们的应用程序完成的,而不是由 ldap 后端完成的。
关于python - 使用 python 检查 ldap 访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4224527/