4

我编写了一个 python 脚本来更改 AD 中的密码,该脚本在命令行中运行良好。现在我将该脚本传输到 Django 以创建更改密码页面。除了一件事之外,一切似乎都有效:出于某种原因,我在 Django 中不断收到一个 TypeError ,它建议应该将字符串而不是 unicode 对象传递给 AD。当然,当我这样做时,AD 会抗议,因为密码不再是 unicode。我猜我忽略了一些简单的东西,但我不知道是什么。

下面是我认为应该可以工作的 views.py 代码(并且在命令行版本中可以工作)。我在密码中添加了 unicode() 只是为了表明它们实际上是 unicode,尽管它们在这些行之前肯定是 unicode。

import ldap
def changePassword(request):
    t = ldap.initialize(server) 
    . . .
    t.simple_bind_s('**********', '****')
    . . .
    mod_attrs = [(ldap.MOD_DELETE, 'unicodePwd', [unicode(oldPassword)]), 
                (ldap.MOD_ADD, 'unicodePwd', [unicode(newPassword)])]
    t.modify_s(dn, mod_attrs)

错误:

('expected a string in the list', u'pass!word')

     Request Method:   POST
      Request URL:     http://127.0.0.1:8000/index/
     Django Version:   1.4.2
     Exception Type:   TypeError
    Exception Value:
                       ('expected a string in the list', u'pass!word')

   Exception Location: /usr/lib/python2.7/dist-packages/ldap/ldapobject.py
                       in _ldap_call, line 96
   Python Executable:  /usr/bin/python
     Python Version:   2.7.3

修改后的版本没有抛出异常,也没有修改密码(因为密码不是unicode传入的):

mod_attrs = [(ldap.MOD_DELETE, 'unicodePwd', [str(oldPassword)]), 
            (ldap.MOD_ADD, 'unicodePwd', [str(newPassword)])]
t.modify_s(dn, mod_attrs)

有谁知道什么可能导致这个 unicode 问题?如果我可以防止 Django 中的异常并保留 unicode,我认为这段代码会起作用。

提前感谢您提供的任何见解。

4

1 回答 1

4

这似乎是 Python LDAP 模块的一个问题。一个快速的解决方法是将所有 Unicode 字符串转换为str(). 我可以通过这种方式在 OpenLDAP 目录中存储包括密码在内的属性。我直接使用 python.ldap,而不是通过 Django。

于 2013-01-11T18:54:21.300 回答