经过身份验证的会话中的请求有时由 Django 中的 AnonymousUser 发送
Requests in authenticated session are sometimes sent by AnonymousUser in Django
我有一个 django 应用程序,它 运行 在 gunicorn 上 nginx 代理后面。
当用户登录时,我将他们重定向到由 Angular 开发的单页应用程序。
我正在为 SPA 中使用的所有函数使用 @login_required 装饰器。
在使用该应用程序时,一个随机函数调用 突然作为 AnonymousUser 发送,所以 @login_required 装饰器不起作用,所以我注销了用户,或显示错误。
我正在使用自定义用户配置文件,会话引擎为 cached_db 运行 by memcached & postgresql 落后于 pgbouncer
我的认证相关设置如下:
ps: get_env_variable() 函数从 OS 环境中获取变量。
AUTH_USER_MODEL = 'main.User'
AUTH_PROFILE_MODULE = 'main.User'
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.sessions',
***
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
#Sessions
SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_NAME = 'sesid'
SESSION_COOKIE_PATH = '/'
SESSION_COOKIE_DOMAIN = 'domain.com'
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_AGE = 1800
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
CSRF_COOKIE_NAME = 'csrftkn'
CSRF_COOKIE_PATH = '/'
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True
CSRF_COOKIE_DOMAIN = 'domain.com'
CSRF_COOKIE_AGE = 1800
CSRF_TRUSTED_ORIGINS = ['domain.com']
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
X_FRAME_OPTIONS = "SAMEORIGIN"
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': get_env_variable("DATABASE_NAME"),
'USER': get_env_variable("DATABASE_USER"),
'PASSWORD': get_env_variable("DATABASE_PASSWORD"),
'HOST': get_env_variable("DATABASE_HOST"),
'PORT' : get_env_variable("DATABASE_PORT"),
'CONN_MAX_AGE': None,
'OPTIONS': {
'sslmode': 'verify-full',
}
}
}
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': "127.0.0.1:11211",
}
}
有趣的是,我对另一个 Django 应用程序使用了相同的设置,效果非常好。 Django 以 AnonymousUser 身份发送一个请求的原因可能是什么?我以前从没见过这个..
此外,如果我删除 @login_required 装饰器,下一个函数调用将作为登录用户发送。因此,15-20 个请求中有 1 个以 AnonymousUser 身份发送。真是奇怪..
我的哨兵日志显示了一个奇怪的问题,即;
DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0xdd in position 12: invalid continuation byte. You passed in 'HTTP_CONNECT\xddON' (<type 'str'>
当我深入了解情况时,发现在我的一个函数中我使用了语言环境并将语言环境设置为 tr_TR。设置语言环境后,请求 headers 从 HTTP_CONNECTION 转换为 HTTP_CONNECT\xddON,这会打乱请求并将请求用户变成 AnonymousUser。
我不知道为什么会这样,但是当我删除语言环境时,它工作得很好。
我有一个 django 应用程序,它 运行 在 gunicorn 上 nginx 代理后面。
当用户登录时,我将他们重定向到由 Angular 开发的单页应用程序。
我正在为 SPA 中使用的所有函数使用 @login_required 装饰器。
在使用该应用程序时,一个随机函数调用 突然作为 AnonymousUser 发送,所以 @login_required 装饰器不起作用,所以我注销了用户,或显示错误。
我正在使用自定义用户配置文件,会话引擎为 cached_db 运行 by memcached & postgresql 落后于 pgbouncer
我的认证相关设置如下: ps: get_env_variable() 函数从 OS 环境中获取变量。
AUTH_USER_MODEL = 'main.User'
AUTH_PROFILE_MODULE = 'main.User'
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.sessions',
***
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
#Sessions
SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_NAME = 'sesid'
SESSION_COOKIE_PATH = '/'
SESSION_COOKIE_DOMAIN = 'domain.com'
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_AGE = 1800
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
CSRF_COOKIE_NAME = 'csrftkn'
CSRF_COOKIE_PATH = '/'
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True
CSRF_COOKIE_DOMAIN = 'domain.com'
CSRF_COOKIE_AGE = 1800
CSRF_TRUSTED_ORIGINS = ['domain.com']
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
X_FRAME_OPTIONS = "SAMEORIGIN"
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': get_env_variable("DATABASE_NAME"),
'USER': get_env_variable("DATABASE_USER"),
'PASSWORD': get_env_variable("DATABASE_PASSWORD"),
'HOST': get_env_variable("DATABASE_HOST"),
'PORT' : get_env_variable("DATABASE_PORT"),
'CONN_MAX_AGE': None,
'OPTIONS': {
'sslmode': 'verify-full',
}
}
}
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': "127.0.0.1:11211",
}
}
有趣的是,我对另一个 Django 应用程序使用了相同的设置,效果非常好。 Django 以 AnonymousUser 身份发送一个请求的原因可能是什么?我以前从没见过这个..
此外,如果我删除 @login_required 装饰器,下一个函数调用将作为登录用户发送。因此,15-20 个请求中有 1 个以 AnonymousUser 身份发送。真是奇怪..
我的哨兵日志显示了一个奇怪的问题,即;
DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0xdd in position 12: invalid continuation byte. You passed in 'HTTP_CONNECT\xddON' (<type 'str'>
当我深入了解情况时,发现在我的一个函数中我使用了语言环境并将语言环境设置为 tr_TR。设置语言环境后,请求 headers 从 HTTP_CONNECTION 转换为 HTTP_CONNECT\xddON,这会打乱请求并将请求用户变成 AnonymousUser。
我不知道为什么会这样,但是当我删除语言环境时,它工作得很好。