【问题标题】:Modify LDAP user via a GUI in Python and Django在 Python 和 Django 中通过 GUI 修改 LDAP 用户
【发布时间】:2018-03-29 21:19:30
【问题描述】:

我正在开发一个 Web 应用程序,供 LDAP 用户登录和编辑他们的属性,例如用户名、描述等。我想知道是否有办法修改登录用户的属性。 python-ldap3库的修改操作符是要走的路,但我只能在代码本身修改一个指定的用户。

是否可以将此作为登录用户的通用功能?我搜索了解决方案,但找不到任何东西。

这是我的修改操作符(modify.py):

from ldap3 import Server, Connection, ALL, MODIFY_REPLACE

s = Server('192.168.1.154', get_info=ALL)

c = Connection(s, 'cn=ldap_user,cn=Users,dc=domain,dc=com', 'Password', auto_bind=False)
c.bind()

c.modify('cn=ldap_user,cn=Users,dc=domain,dc=com',
        {'givenName': [(MODIFY_REPLACE, ['Test'])],
         'sn': [(MODIFY_REPLACE, ['User'])]})
print(c.result)

c.unbind()

顺便说一句,我正在使用 Django,所以在这一点上,我什至不知道我必须在哪里和做什么。

我的 edit_profile 视图:

def edit_profile(request):
if request.method == 'POST':
    form = EditProfileForm(request.POST, instance=request.user)

    if form.is_valid():
        form.save()
        return redirect(reverse('accounts:view_profile'))
else:
    form = EditProfileForm(instance=request.user)
args = {'form': form}
return render(request, 'accounts/edit_profile.html', args)

我的 EditProfileForm:

class EditProfileForm(UserChangeForm):
first_name = forms.CharField(max_length=30, required=False,
widget=forms.TextInput(
        attrs={
            'class': 'form-control',
            'type': 'text',
            'name': 'first_name',

        }
    )
)

last_name = forms.CharField(max_length=30, required=False,
widget=forms.TextInput(
        attrs={
            'class': 'form-control',
            'type': 'text',
            'name': 'last_name',
        }
    )
)

email = forms.EmailField(max_length=30, required=True,
widget=forms.TextInput(
        attrs={
            'class': 'form-control',
            'type': 'email',
            'name': 'email',
        }
    )
)

password = forms.CharField(required=False,
widget=forms.PasswordInput(
        attrs={
            'class': 'form-control',
            'type': 'hidden',
            'name': 'password',
        }
    )
)

class Meta:
    model = LdapUser
    fields = (
        'first_name',
        'last_name',
        'email',
        'password'
    )

【问题讨论】:

    标签: python django ldap


    【解决方案1】:

    一个新的ModifiableConnection 类可以使用Connection 和一个声明来修改属性的方法组成。 例如

    from ldap3 import Server, Connection, ALL, MODIFY_REPLACE
    
    
    class ModifiableConnection(object):
        def __init__(self, *args, **kwargs):
            self.conn = Connection(*args, **kwargs)
    
        def _modify_attr(self, attrname, values):
             attr = {attrname: [(MODIFY_REPLACE, values)]}
             self.conn.modify(self.conn.user, attr)
    
        def unbind(self):
             self.conn.unbind()
    
        @property
        def firstname(self): pass
    
        @firstname.setter
        def firstname(self, val):
            self.modify_attr('givenName', [val])
    
        @property
        def lastname(self): pass
    
        @lastname.setter
        def lastname(self, val):
            self.modify_attr('sn', [val])
    
    
    
        def bind(self):
             self.conn.bind()
    
    server = Server('192.168.1.154', get_info=ALL)
    
    user = 'cn=ldap_user,cn=Users,dc=domain,dc=com'
    mod_con = ModifiableConnection(server, user, 'Password', auto_bind=False)
    mod_con.bind()
    
    mod_con.firstname = 'Test'
    mod_con.lastname = 'User'
    
    mod_con.unbind()
    

    【讨论】:

    • 谢谢苏先生。但最后,您仍然修改特定属性 (mod_con.modify_attr('givenName', ['Test']) mod_con.modify_attr('sn', ['User']) 我想要的是一个适用于所有人的函数用户。所以用户应该在应用程序中输入他的名字,例如,它会通过点击提交按钮在 LDAP 中更改它。这甚至可能还是我必须每次都为每个用户运行你的代码?
    • 我的示例与当前连接的用户紧密耦合。用户可以修改其他用户的属性吗?
    • 哦,不抱歉。只有登录的用户才能更改自己的数据。我只是对您在代码中编写了“测试”和“用户”感到困惑。如果我错了,请纠正我,但是“测试”和“用户”应该没有占位符吗?
    • 是的,当然。该示例中的主要思想是公开一种用于更新条目属性的方法。您将编写一个提交到 视图函数基于类的视图 的表单,该视图传递来自表单的用户条目。假设用户输入文本为"Firstname Lastname"。您可以在视图函数中拆分它并适当地传递下去。例如names = "Firstname Lastname" firstname, lastname = names.split(' ') mod_con.modify_attr('givenName', [firstname] 最好在 ModifiableConnection 类中声明 firstname 和 lastname 属性
    • 好的,这非常有帮助。谢谢苏先生。我有没有在视图中调用类?看上面。我发布了我的表格和观点。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多