使用新数据库帮助Django RemoteUserMiddleware RemoteUserBackend

时间:2011-05-04 02:01:15

标签: python django django-authentication

Django的1.3版本包括RemoteUserMiddlewareRemoteUserBackend类允许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输出显示设置实际上按请求的顺序有AuthenticationMiddlewareRemoteUserMiddleware

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

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,经过一些调试后发现我忘了为auth和其他应用程序创建mysql(我认为与sqllite的情况相同)。所以,如果你没有,你将需要运行python manage.py syncdb或以其他方式创建它们

答案 1 :(得分:0)

这是一个丑陋的解决方法。

我创建了一个单元测试用例,它在股票开发环境中运行良好。基于此,我在Apache服务器上进入了上面提到的RemoteMilddleware.process_request()函数,并禁用了user属性的测试。它工作得很好......

我不会选择这个作为答案,但我认为我应该为其他被阻止的人记录此解决方法。我会研究提交错误报告。

任何人都知道正确的解决方案或如何在Apache2中攻击它?所有回溯和变量信息表明Apache正确设置REMOTE_USER,但Django1.3没有正确使用它进行身份验证。