1

我正在尝试将项目从 Django 1.4 迁移到 Django 1.5.1 ...

Web 服务必须可作为经过身份验证的用户和匿名用户访问。我们使用带有 Apache 模块的外部身份验证(根据https://docs.djangoproject.com/en/1.5/howto/auth-remote-user/设置“REMOTE_USER”环境变量)。

url https://example.com/具有不同的内容,具体取决于用户是匿名的还是经过身份验证的。

我们在 Django 1.4 中使用的策略是只有以 /auth/ 开头的 url 才会被 Apache 的模块验证。如果用户(位于https://example.com/页面上)选择进行身份验证,他会跳转到https://example.com/auth/。/auth/ 由 Apache 的模块进行身份验证,然后由 Django 应用程序提供服务,该应用程序重定向回https://example.com/。由于 session_key,Django 知道用户已通过身份验证。

不幸的是,对于 Django 1.5.1 ...每次浏览器从经过身份验证的 URL 移动到未经过身份验证的 URL 时,session_key 都会更改。

在我的日志中,我可以看到 (Django 1.5.1) :

DEBUG 2013-04-09 09:15:20,571 views home None
DEBUG 2013-04-09 09:15:48,886 views auth ow1bzgdajs7i12d9bmfwwm3fpw47elna
DEBUG 2013-04-09 09:15:48,981 views home mehlf1x0iemx9yc3ddf6mhnls1nha1r4
  • 第一行是用户访问https://example.com/时。
  • 其次,当他点击“Connexion”按钮时。
  • 第三是 HttpResponseRedirect 到 / 。
  • 最后一个字符串是 request.session.session_key 。

当我在 /auth (Django 1.5.1) 上删除 apache 身份验证时:

DEBUG 2013-04-09 09:16:45,268 views home None
DEBUG 2013-04-09 09:16:48,258 views auth None
DEBUG 2013-04-09 09:16:48,345 views home None

使用 Django 1.4,相同的日志给出的内容如下:

DEBUG 2013-04-09 09:11:21,899 views home None
DEBUG 2013-04-09 09:11:41,261 views auth f16ab3e574b866177803f9011dc33ab8
DEBUG 2013-04-09 09:11:41,375 views home f16ab3e574b866177803f9011dc33ab8

这种行为改变是预期的吗?(新功能?)我们如何修复它?

谢谢!

4

2 回答 2

3

这是一个错误修复:https ://code.djangoproject.com/ticket/17869 。

它记录在 Django 1.5 的发行说明中:

现在,当 REMOTE_USER 标头在同一浏览器会话期间消失时,RemoteUserMiddleware 会强制注销。

于 2013-04-13T06:43:51.347 回答
1

正如 Aymeric 提到的,这是 Django 1.5 中出现的预期错误修复。:) :(

在我们的例子中,即使 Apache 的模块不再提供“REMOTE_USER”变量,我们也确实需要会话持续存在。为了解决这个问题,我发现了两种可能性:

  1. 子类 RemoteUserMiddleware 并仅重新定义方法 process_request 没有代码 auth.logout(request)
  2. 插入一个自制的中间件,在需要时将用户名注入到 REMOTE_USER 中。

我选择了第二种可能性,因为它将/应该是零努力地适应即将推出的 Django 版本。

在我'main.middleware.persistant_session_middleware'之前添加的 settings.py 中'django.contrib.auth.middleware.RemoteUserMiddleware'

并在 main/middleware.py 中定义了persistant_session_middleware :

class persistant_session_middleware(object):
def __init__(self):
    pass

def process_request(self, request):
    header = "REMOTE_USER"

    if request.user.is_authenticated() and not header in request.META:
        request.META[header] = request.user.username
    return None

我只是希望这不会是一个安全漏洞!但只要这取决于request.user.is_authenticated()我认为我们是安全的:)

于 2013-04-15T14:02:32.870 回答