У меня есть приложение django, которое работает на gunicorn за прокси-сервером nginx.
Когда пользователи входят в систему, я перенаправляю их в одностраничное приложение, разработанное Angular.
Я использую декоратор @login_required для всех функций, используемых в SPA.
При использовании приложения один случайный вызов функции внезапно отправляется как AnonymousUser, поэтому декоратор @login_required не работает, поэтому я выхожу из системы пользователя или показываю ошибку.
Я использую собственный профиль пользователя с механизмом сеанса cached_db, управляемым memcached и postgresql за pgbouncer.
Мои относительные настройки аутентификации следующие: ps: функция get_env_variable() получает переменную из среды ОС.
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, следующий вызов функции будет отправлен как зарегистрированный пользователь. Таким образом, 1 из 15-20 запросов отправляется как AnonymousUser. Что действительно странно..