4

コマンドラインからうまく機能するADのパスワードを変更するためのPythonスクリプトを作成しました。現在、パスワード変更ページを作成するために、そのスクリプトを Django に転送しています。1 つのことを除いてすべてが機能しているようです。何らかの理由で、Unicode オブジェクトではなく文字列を AD に渡す必要があることを示唆する TypeError が Django で発生し続けます。もちろん、これを行うと、AD はパスワードがユニコードではなくなるため抗議します。単純なものを見落としていると思いますが、何がわかりません。

以下は、動作すると思われるview.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)

このユニコードの問題につながる可能性があることを知っている人はいますか? Django で例外を防ぎ、Unicode を保持できれば、このコードは機能すると思います。

あなたが提供できるかもしれない洞察を前もって感謝します。

4

1 に答える 1

4

これは、Python LDAP モジュール全般に問題があるようです。簡単な修正は、すべての Unicode 文字列をstr(). この方法で、パスワードを含む属性を OpenLDAP ディレクトリに保存できます。Djangoではなく、直接python.ldapを使用していました。

于 2013-01-11T18:54:21.300 に答える