Ldap和用户组(需要ldap-group)

时间:2011-07-12 08:55:28

标签: web2py

我正在开发一个APP,我想在我们的LDAP中使用这个APP 并按组过滤用户。我在APACHE中有这段代码:

           AuthLDAPURL ldap://localhost/ou=users,dc=domain,dc=com?uid
           AuthLDAPGroupAttribute memberUid
           AuthLDAPGroupAttributeIsDN off
           AuthzLDAPAuthoritative on
           Require ldap-group cn=developer,cn=testers,cn=groups,dc=domain,dc=com

工作正常。只有列表开发人员和测试人员才能获得 在这个区域内。我试图在Web2py中做同样的事情,但我不能 从群组中过滤

我有这个代码,没有群组就可以正常工作:

auth.settings.login_methods=[ldap_auth(mode='uid_r',server='localhost',port='389',
base_dn='ou=users,dc=domain,dc=com', filterstr='objectClass=*')]

我不确定如何使用:在web2py中需要ldap-group。

任何人都可以帮助我?

提前多多谢谢

1 个答案:

答案 0 :(得分:0)

我自己一直在努力解决这个问题。我认为解决方案是通过执行一些LDAP查询从LDAP导入组。

这种方法的不好之处在于它要求您(1)在使用FIRST登录时将组插入到web2py auth_group表中。(2)如果组倾向于改变,则需要维护组。这可以通过cron作业或手动完成。

您可以在此之前查看用户是否已登录:

query = (db.auth_event.description.like('%Logged-in%'))&(db.auth_event.user_id==auth.user.id)

if db(query).count() == 1:
  # Query LDAP for group membership, update auth_group table

以下是LDAP查询的一些示例代码 - 这个代码仅基于查找用户信息(我不确定LDAP如何组织组 - 我将编写代码以在一周或两周内提取组):     import ldap     从ldap.filter导入filter_format为ff

ldap_attrs = ['sn','givenName','telephoneNumber', 'mail' ]

FILTER_TPL = '(&%s(objectclass=i3person))'
sch = ff('(%s=%s)', ('uid', auth.user.username))

ldap_filter = FILTER_TPL % sch
con = ldap.initialize("ldap://YOUR-LDAP-SERVER")
dn= "YOUR-DN-FOR-USERS/GROUPS"
mode = "uid"
port = 389
ldap_results = con.search_s(dn, ldap.SCOPE_SUBTREE, ldap_filter, ldap_attrs)

dn, res = ldap_results[0]

您可以在此处获取有关python的ldap的更多信息: http://www.python-ldap.org/docs.shtml

(这个代码示例与查询组相关) http://www.ibm.com/developerworks/aix/library/au-ldap_crud/

另外,不要忘记使用filter_format(导入为上面的ff),如果允许任何用户输入进入代码,它将转义ldap查询以防止LDAP注入。出于我的目的,我正在制作一个可公开访问的表单,用于搜索人员的LDAP条目。

这是一篇关于将ActiveDirectory组镜像到LDAP组的帖子。我发布这个是因为虽然它正好相反,但其中一些仍然有用,特别是从LDAP获取组的过滤器,因为无论是读取还是写入都是相同的,它使用python-ldap: http://oxpedia.org/wiki/index.php?title=Mirorring_Active_Directory_user_acconts_in_LDAP

如果您的ldap组没有太大变化,您可以创建一个执行以下操作的脚本:

  • 删除web2py帐户的所有组成员资格(重新开始)。
  • 对于每个帐户,查询组的ldap
    • 对于每个查询,提取所有组。
    • 将组复制到auth_groups(如果不存在)
    • 将成员添加到组(auth_membership或其他什么?)

然后根据需要运行脚本。我喜欢在运行这样的ETL脚本时删除内容,因为这样你就可以重新开始,不会复制内容或在事情已经存在时遇到错误并违反数据库约束。