簡體   English   中英

Apache,LDAP和WSGI編碼問題

[英]Apache, LDAP and WSGI encoding issue

我在Ubuntu 14.04.2(x86_64)和python 3.4.0上將Apache 2.4.7與mod_wsgi 3.4一起使用。 我的python應用程序依靠apache對我們公司的LDAP服務器(MS Active Directory 2008)執行用戶身份驗證。 它還使用操作系統環境將一些其他LDAP數據傳遞給python應用程序。 在apache配置中,我像這樣查詢LDAP:

…
AuthLDAPURL "ldap://server:389/DC=company,DC=lokal?sAMAccountName,sn,givenName,mail,memberOf?sub?(objectClass=*)"
AuthLDAPBindDN …
AuthLDAPBindPassword …
AuthLDAPRemoteUserAttribute sAMAccountName
AuthLDAPAuthorizePrefix AUTHENTICATE_
…

這會將一些用戶數據傳遞到我的WSGI腳本,在該腳本中,我按如下方式處理信息:

# Make sure the packages from the virtualenv are found
import site
site.addsitedir('/home/user/.virtualenvs/ispot-cons/lib/python3.4/site-packages')

# Patch path for app (so that libispot can be found)
import sys
sys.path.insert(0, '/var/www/my-app/')

import os
from libispot.web import app as _application

def application(environ, start_response):
    os.environ['REMOTE_USER'] = environ.get('REMOTE_USER', "")
    os.environ['REMOTE_USER_FIRST_NAME'] = environ.get('AUTHENTICATE_GIVENNAME', "")
    os.environ['REMOTE_USER_LAST_NAME'] = environ.get('AUTHENTICATE_SN', "")
    os.environ['REMOTE_USER_EMAIL'] = environ.get('AUTHENTICATE_MAIL', "")
    os.environ['REMOTE_USER_GROUPS'] = environ.get('AUTHENTICATE_MEMBEROF', "")
    return _application(environ, start_response)

然后,我可以使用os.environ.get(…)在我的python應用程序中訪問此信息。 (順便說一句:如果您有更好的解決方案,請告訴我!)

問題在於,某些用戶名包含未正確編碼的特殊字符(德國變音符號,例如äöüÄÖÜ )。 因此,舉例來說,這個名字Tölle到達我的Python應用程序為Tölle

顯然,這是一個編碼問題,因為

$ echo "Tölle" | iconv --from utf-8 --to latin1 

給我正確的Tölle

另一個可能有幫助的觀察結果:在我的Apache日志中,我發現字符ü表示為\\xc3\\x83\\xc2\\xbc

我在/etc/apache2/envvars告訴我的Apache使用LANG=de_DE.UTF-8而python 3也支持utf-8。 我似乎無法指定有關LDAP服務器的任何信息。 所以我的問題是:編碼在哪里混淆了,我該如何修補?

不好的做法是在每個請求上將值復制到os.environ ,因為如果WSGI服務器運行在多線程配置下,並且並發請求之間會相互干擾,這將很慘。 而是查看線程局部變量。

至於來自LDAP的編碼數據問題,如果我理解這個問題,則需要這樣做:

"Tölle".encode('latin-1').decode('utf-8')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM