Skip to main content
 首页 » 编程设计

python之在 Django 中修改 Active Directory 用户

2024年08月19日34findumars

所以我正在尝试修改我的事件目录中的用户。到目前为止,我可以以 AD 用户身份登录,但是当我尝试编辑我的个人资料时,它并没有在 AD 中实现。

我使用 django-auth-ldap 作为 AD 后端。

我与具有读写权限的用户建立了连接。

AUTH_LDAP_SERVER_URI = "ldap://192.168.1.12" 
 
AUTH_LDAP_BIND_DN = "user" 
AUTH_LDAP_BIND_PASSWORD = "password" 
AUTH_LDAP_CONNECTION_OPTIONS = { 
    ldap.OPT_DEBUG_LEVEL: 1, 
    ldap.OPT_REFERRALS: 0 
} 
AUTH_LDAP_USER_SEARCH = LDAPSearch("DC=sb,DC=ch", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)") 
 
# Set up the basic group parameters. 
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("DC=sb,DC=ch", ldap.SCOPE_SUBTREE, "(objectClass=group)") 
AUTH_LDAP_GROUP_TYPE = NestedActiveDirectoryGroupType() 
 
 
# What to do once the user is authenticated 
AUTH_LDAP_USER_ATTR_MAP = { 
    "first_name": "givenName", 
    "last_name": "sn", 
    "email": "mail" 
} 
 
AUTH_LDAP_USER_FLAGS_BY_GROUP = { 
    "is_active": "CN=ipa-users,cn=users,DC=sb,DC=ch", 
    "is_staff": "CN=ipa-users,cn=users,DC=sb,DC=ch", 
    "is_superuser": "CN=ipa-users,cn=users,DC=sb,DC=ch" 
} 
 
# This is the default, but be explicit. 
AUTH_LDAP_ALWAYS_UPDATE_USER = True 
 
# Use LDAP group membership to calculate group permissions. 
AUTH_LDAP_FIND_GROUP_PERMS = True 
 
# Cache settings 
AUTH_LDAP_CACHE_GROUPS = True 
AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600 
 
AUTHENTICATION_BACKENDS = ( 
    'django_auth_ldap.backend.LDAPBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

那么我必须在何处设置或获取任何东西?

这是我的 edit_profile.html:

<form method="post"> 
        {% csrf_token %} 
 
        <label for="first_name">Vorname </label> 
        <input style="margin-bottom: 1em;" id="first_name" class="form-control" type="text" name="first_name" value="{{ user.first_name }}"><br> 
        <label for="last_name">Nachname </label> 
        <input style=" margin-bottom: 1em;" id="last_name" class="form-control" type="text" name="last_name" value="{{ user.last_name }}"><br> 
        <label for="email">E-Mail </label> 
        <input style="margin-bottom: 1em;" id="email" class="form-control" type="email" required=True unique=True name="email" value="{{ user.email }}"><br> 
 
        <button class="btn btn-success btn-sm" type="submit">Bestätigen</button> 

请您参考如下方法:

只用django-auth-ldap是不可能的

粗略的猜测表明您正在使用 django-auth-ldap(我更新了您的问题)。一看就知道只有后台,其他什么都做不了。

如果你真的想更新AD中的一些数据,你需要自己做。我正在使用 python-ldap3我可以为此推荐。它还包括一些专门针对 AD 的助手。


更新:根据要求,一个使用python-ldap3

的例子

类似的东西,不确定下面的代码是否有效(它是现有代码的混搭)。但它应该让你知道你应该做什么。欢迎来到 LDAP 的 hell 。

import ldap3 
 
conn = ldap3.Connection( 
    server="ldaps://foobar", 
    user="username@domain",  # normally full DN, but AD supports this format as well 
    password="password", 
    auto_bind=ldap3.AUTO_BIND_NONE, 
    authentication=ldap3.SIMPLE, 
    raise_exceptions=True, 
    auto_referrals=False,  # 90% you want it set to False 
    receive_timeout=10,  # seconds, exception afterwards 
) 
 
conn.start_tls() 
conn.bind() 
 
search = conn.extend.standard.paged_search( 
    search_base="dc=domain", 
    search_filter="(userPrincipalName=username@domain)",  # or (cn=username) or (sAMAccountName=username) or whatever 
    search_scope=ldap3.SUBTREE, 
    attributes=ldap3.ALL_ATTRIBUTES, 
    dereference_aliases=ldap3.DEREF_NEVER, 
    generator=True, 
) 
 
entries = [entry for entry in search if entry["type"] == "searchResEntry"]  # not sure how to get rid of all the aliases otherwise 
 
assert len(entries) is 1, "got {0} entries".format(len(entries)) 
entry = entries[0] 
 
dn = entry["dn"] 
 
changes = { 
    "attributeName": [ 
        [ldap3.MODIFY_DELETE, ["old value 1", "old value 2",]], 
        [ldap3.MODIFY_ADD, ["a new value"]], 
    ] 
} 
 
conn.modify(dn, changes) 
 
conn.unbind()