繁体   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