Django的1.3版本包括RemoteUserMiddleware
和
RemoteUserBackend
类允许Apache进行身份验证。
见http://docs.djangoproject.com/en/dev/howto/auth-remote-user/
我有一个initial_data.json,它在执行syncdb时创建一个超级用户。 dumpdata证实了这一点。
但是我发现它似乎没有使用新创建的数据库正确登录。我得到一个不正确的配置异常,说: Django远程用户身份验证中间件需要安装身份验证中间件。
Edit your MIDDLEWARE_CLASSES setting to insert django.contrib.auth.middleware.AuthenticationMiddleware' before the RemoteUserMiddleware class.
追溯指向RemoteMilddleware.process_request()
:
def process_request(self, request):
# AuthenticationMiddleware is required so that request.user exists.
if not hasattr(request, 'user'):
raise ImproperlyConfigured(...
Apache的DEBUG输出显示设置实际上按请求的顺序有AuthenticationMiddleware
和RemoteUserMiddleware
:
MIDDLEWARE_CLASSES
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
但是没有设置request.user属性,从而产生异常。
如果我仔细查看django.contrib.auth.backends和中间件的源代码,
我发现AuthenticationMiddleware
正在注册LazyUser
请求类。但是RemoteUserBackend
似乎没有
调用authenticate()方法,这是在Users表中查找remote_user的地方。
为了创建request.user,我应该做些什么才能调用authenticate()
?
我可以根据需要提供更多信息。顺便说一句,这是使用SSL。那是否有一些我没想到的互动?
我应该提一下,我正在使用Apache2.2.14和mod_wsgi
。
答案 0 :(得分:2)
我遇到了同样的问题,经过一些调试后发现我忘了为auth和其他应用程序创建mysql(我认为与sqllite的情况相同)。所以,如果你没有,你将需要运行python manage.py syncdb或以其他方式创建它们
答案 1 :(得分:0)
这是一个丑陋的解决方法。
我创建了一个单元测试用例,它在股票开发环境中运行良好。基于此,我在Apache服务器上进入了上面提到的RemoteMilddleware.process_request()
函数,并禁用了user
属性的测试。它工作得很好......
我不会选择这个作为答案,但我认为我应该为其他被阻止的人记录此解决方法。我会研究提交错误报告。
任何人都知道正确的解决方案或如何在Apache2中攻击它?所有回溯和变量信息表明Apache正确设置REMOTE_USER,但Django1.3没有正确使用它进行身份验证。