2010-11-19 95 views
2

我正在为LDAP服务器编写Web前端(django)。有不同类型的人拥有不同的权限,因此我设置了LDAP ACL来控制谁可以查看或编辑特定的属性。 现在很容易确定某个特定用户是否具有读取权限 - 尝试阅读,您将看到您获得的信息。 但我没有看到一个优雅的方式来区分之前的读写访问我实际上尝试写一些更改。也就是说,我想在界面中说清楚,如果登录的用户有写访问权限,或者只能读取。所以用户不会尝试编辑他们不能的属性。使用python检查ldap访问权限

我想到的唯一办法是尝试暂时将某种虚拟物写入属性中,并查看是否成功。如果是这样,原始值将被恢复,并且我知道该用户具有写入权限。然后我可以将此属性显示为可编辑。 这样做的问题是如果服务器在虚拟文件被写入之后并且原始值已被恢复之前崩溃,则在我的LDAP服务器中留下虚拟值。

我需要的是一些查询ACL的方式,类似于我可以查询模式定义的方式。但也许这是LDAP“禁止”的?

任何想法?

艾萨克

+0

哪些LDAP服务器你使用?您使用哪种界面/绑定来访问它? – ThomasH 2010-11-19 11:55:38

+0

我使用openldap 2.3.32和python 2.6 ldap绑定(import ldap) – Isaac 2010-11-19 12:02:20

+0

我发现我不需要编写一个虚拟文件来查看我是否具有写入权限。我可以尝试写入原始值,如果我没有写入权限,将导致错误,并且如果我具有读权限,则不会更改任何内容。尽管如此,看起来不那么优雅。 – Isaac 2010-11-19 12:08:30

回答

0

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(whoami_s python-ldap),你可以确定用户是否拥有一些权利。你不需要测试你是否可以编写数据,在你的django应用程序中实现一个检查DN的函数。

也许你是在说,ACL是dinamically生成的?


关于你的评论,如果你的ACL是静态的,要知道ACL的,更简单的办法来实现蟒蛇设施谁是实现这些访问控制列表。与我以前为例:

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) 

现在,蟒蛇,LDAP无法检索的slapd.conf的ACL ......它是不是安全解析的slapd.conf(因为slapd.conf中可以“在任何地方“在系统和ACLs声明可能很难分析),也需要花费很多时间来尝试在LDAP后端写入数据。

我知道这不是很满意。另一个解决方案是使用“服务用户”。只有此用户对LDAP后端具有写权限。

它简化了ACL的写作:

access to * 
    by dn.exact="cn=manager,dc=myproduct,dc=org" write 
    by * none 

然后,在普通用户,您可以设置一个授权的标志。 当您的登录用户想要做某件事时,您的应用程序会检查该标志。如果此标志正常,则服务用户将数据写入后端。

这是我们在我们的应用程序中部署的策略。

在这两种情况下,ACL的检查都由我们的应用程序完成,而不是由ldap后端完成。

+0

对不起,我的理解可能会很慢,但是:如果我知道我的DN,我怎么知道ACL? ACL在slapd.conf中定义,至少在概念上我的django应用程序是未知的。你是否建议我从django解析slapd.conf? – Isaac 2010-11-19 16:37:40

+0

要回答你的问题:我的ACL是静态的。尽管如此,我可能会偶尔改变一些设置,所以我想有一个地方来定义它们。 – Isaac 2010-11-19 16:38:27

+0

@Isaac,我用更多的信息完成了我的答案 – ohe 2010-11-20 10:29:25

0

我想我会尝试“测试”接近,如果它太慢也许有一些缓存。 我只想在ACL服务器上保留ACL定义的原因是,还有其他方法可以与服务器交互(将有cli工具和标准ldap工具),所以我想保留那些接口同步ACL明智,只有一个地方可以定义ACL