- Введение
- Базовая настройка аутентификации
- Улучшенное шифрование с Argon2
- Реализация представлений
- Работа с cookies и сессиями
Данное руководство описывает процесс настройки аутентификации в Django, включая создание пользователей, вход в систему, выход из системы, а также работу с сессиями и cookies.
Для начала необходимо убедиться, что в settings.py
добавлены необходимые middleware и приложения:
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
...
]
MIDDLEWARE = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
...
]
Argon2 является рекомендованным алгоритмом хеширования паролей. Для его использования в Django:
- Установите необходимый пакет:
pip install django[argon2]
- Добавьте настройки в
settings.py
:
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
]
# Представление для регистрации новых пользователей
class RegistrationView(CreateView):
form_class = UserCreationForm
template_name = "myauth/registration.html"
success_url = reverse_lazy('myauth:me')
def form_valid(self, form):
# После успешной валидации формы создаем пользователя
response = super().form_valid(form)
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password1')
# Аутентифицируем и выполняем вход
user = authenticate(self.request, username=username, password=password)
login(self.request, user)
LOGGER.info("User: %s was authenticated successfully", username)
return response
# Представление для входа в систему
class LoginView(View):
template_name = 'auth/login.html'
def get(self, request: HttpRequest) -> HttpResponse:
# Проверяем, не авторизован ли уже пользователь
if request.user.is_authenticated:
LOGGER.info("User %s already logged in", request.user)
return redirect("auth:index")
return render(request, self.template_name)
def post(self, request: HttpRequest) -> HttpResponse:
username = request.POST["username"]
password = request.POST["pwd"]
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
LOGGER.info("User %s successfully logged in", user)
return redirect("auth:index")
LOGGER.warning("Failed login attempt for username: %s", username)
return render(
request,
self.template_name,
{'error': 'Invalid username or password'}
)
# Функциональное представление для выхода
def logout_view(request: HttpRequest) -> HttpResponse:
logout(request)
return redirect(reverse("auth:login"))
# Классовое представление для выхода
class LogOutView(View):
def get(self, request):
logout(request)
return redirect('myauth:login')
# Установка cookie
def set_cookie_view(request: HttpRequest) -> HttpResponse:
response = HttpResponse("Cookie set")
response.set_cookie("fizz", "buzz", max_age=36000)
return response
# Получение cookie
def get_cookie_view(request: HttpRequest) -> HttpResponse:
value = request.COOKIES.get("fizz")
return HttpResponse("Cookie value {}".format(value))
# Установка значения в сессию
def set_session_view(request: HttpRequest) -> HttpResponse:
request.session["foobar"] = "spameggs"
LOGGER.info("session: %s" % request.session.items())
return HttpResponse("Session set")
# Получение значения из сессии
def get_session_view(request: HttpRequest) -> HttpResponse:
val = request.session.get("foobar")
return HttpResponse("Session value {}".format(val))
Рекомендации по безопасности:
- Всегда используйте HTTPS в продакшене
- Настройте правильные заголовки безопасности
- Используйте надёжные пароли
- Регулярно обновляйте Django до последней версии
- Используйте защиту от CSRF (встроена в Django)
Для работы представлений необходимо создать соответствующие шаблоны:
myauth/registration.html
- форма регистрацииmyauth/login.html
- форма входаmyauth/about-me.html
- страница профиля пользователя
В файле settings.py
добавьте следующие настройки для обеспечения HTTPS:
# Перенаправление всех HTTP запросов на HTTPS
SECURE_SSL_REDIRECT = True
# Использовать безопасные куки только через HTTPS
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# Настройка HSTS (HTTP Strict Transport Security)
SECURE_HSTS_SECONDS = 31536000 # 1 год
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
Добавьте следующие настройки в settings.py
для установки важных заголовков безопасности:
# Защита от clickjacking атак
X_FRAME_OPTIONS = 'DENY'
# Включение XSS-фильтра браузера
SECURE_BROWSER_XSS_FILTER = True
# Предотвращение MIME-type сниффинга
SECURE_CONTENT_TYPE_NOSNIFF = True
# Настройка CSP (Content Security Policy)
CSP_DEFAULT_SRC = ("'self'",)
CSP_STYLE_SRC = ("'self'", "'unsafe-inline'")
CSP_SCRIPT_SRC = ("'self'",)
CSP_IMG_SRC = ("'self'",)
CSP_FONT_SRC = ("'self'",)
Для использования CSP необходимо установить django-csp:
pip install django-csp
И добавить middleware в settings.py
:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'csp.middleware.CSPMiddleware',
# ... другие middleware
]
# Настройка длины паролей
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 12,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
]
# Настройка сессий
SESSION_COOKIE_AGE = 1800 # 30 минут
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
- Используйте доверенный SSL/TLS сертификат (например, Let's Encrypt)
- Регулярно обновляйте все зависимости проекта
- Настройте правильные права доступа к файлам на сервере
- Используйте отдельные настройки для разработки и продакшена
- Регулярно проводите аудит безопасности
Пример конфигурации для продакшена в отдельном файле settings_prod.py
:
from .settings import *
DEBUG = False
ALLOWED_HOSTS = ['your-domain.com']
# Настройки базы данных
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_db_name',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'localhost',
'PORT': '5432',
}
}
# Настройки кэширования
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
}
}
# Настройки логирования
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'WARNING',
'class': 'logging.FileHandler',
'filename': '/path/to/django/logs/prod.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'WARNING',
'propagate': True,
},
},
}