Введение в авторизацию пользователей

Курс по Django: https://stepik.org/a/183363

Архив проекта: 59_sitewomen.zip

Мы начинаем новый важный раздел фреймворка Django – авторизация пользователей на сайте. Думаю, излишне описывать, что это такое и зачем это нужно. Все мы постоянно с этим сталкиваемся, когда нас просят ввести логин и пароль для входа в личный кабинет и доступа к закрытой части сайта. Типичный пример – социальные сети. Для пользования ими нужно вначале указать логин (телефон) и пароль, после чего мы переходим на свою страничку (профиль) и имеем возможность социального взаимодействия с другими такими же пользователями сети. Благодаря авторизации пользователя сервер имеет возможность выдавать ему закрытую (персональную) информацию, предназначенную только для этого пользователя и никакого другого. В этом главный смысл и цель создания механизма авторизации. И о нем мы с вами будем подробно говорить на ближайших занятиях.

Вначале немного терминологии, чтобы мы понимали друг друга, да и к тому же фреймворк Django их использует в модуле авторизации:

  • Authentication (аутентификация) - проверка подлинности (наличия) пользователя по введенным данным (обычно, это логин/пароль). Как правило, это ассоциация (связь) введенных данных с пользователем, сохраненным в БД.
  • Authorization (авторизация) – разрешение на доступ (непосредственно вход) к закрытой части сайта. Часто на этом этапе выполняется сохранение в сессии идентификатора пользователя, говорящий о том, что пользователь успешно прошел аутентификацию.

Как используется механизм авторизации пользователя? Смотрите, когда на север приходит запрос от пользователя, то на стороне сайта (сервера) важно знать авторизован уже этот пользователь или нет. То есть, он мог ранее войти на сайт, набрав логин и пароль. Фреймворк Django хранит эту информацию в сессии и при поступлении очередного запроса от этого же пользователя он воспринимается как авторизованный и автоматически аутентифицируется.

Если же пользователь не авторизован, то на сайте должна отобразиться  форма авторизации, где пользователю предлагается ввести логин и пароль:

Именно такой функционал нам предстоит внедрить на наш сайт. Ну а подробную информацию об авторизации, как всегда, можно посмотреть на странице документации по следующей ссылке:

https://docs.djangoproject.com/en/4.2/topics/auth/default/

Таблица user

При установке и создания проекта фреймворк Django сразу формирует набор таблиц для хранения информации по пользователям. Если открыть программу SQLiteStudio, то мы увидим таблицы с префиксом auth и среди них таблицу auth_user. Как раз здесь хранятся записи по пользователям нашего сайта. Откроем эту таблицу и видим ее структуру с полями password, username, email, is_active и другими. И имеется одна запись для суперпользователя, которого мы с вами ранее создавали. Так вот, в процессе аутентификации по полям username и password фреймворк Django выполняет связывание конкретной записи из этой таблицы. Если запись с указанными данными находится, то пользователь считается аутентифицированным. Иначе у него не будет доступа к закрытым страницам сайта.

Помимо таблицы auth_user есть и другие вспомогательные таблицы, в частности auth_permission для разрешений зарегистрированных пользователей; или таблица auth_group для хранения информации о группах пользователей. И некоторые другие. Все это часть стандартного модуля авторизации фреймворка Django. Конечно, его можно настраивать под свои нужны и расширять. В частности, нередко можно встретить расширение стандартной таблицы для хранения зарегистрированных пользователей, так как существующих полей таблицы auth_user бывает просто недостаточно. Как это сделать мы с вами еще будем говорить, а вначале воспользуемся стандартными таблицами для авторизации пользователей.

Создание приложения авторизации

Модуль авторизации логично рассматривать как расширение функционала уже существующего сайта. Поэтому мы его реализуем отдельным приложением с именем users. Для этого в терминале выполним команду:

python manage.py startapp users

Затем, в пакете конфигурации в файле settings.py подключим это приложение, прописав его в коллекции INSTALLED_APPS:

INSTALLED_APPS = [
    ...
    "users.apps.UsersConfig",
]

Также обратите внимание, что в списке MIDDLEWARE должны присутствовать модули:

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    ...
]

Они автоматически срабатывают при каждом запросе-ответе и необходимы для работы модуля авторизации фреймворка Django, основанного на сессиях.

Следующим шагом мы создадим файл urls.py в рамках текущего приложения для определения списка маршрутов. Начальное содержимое этого файла будет следующим (по аналогии с файлом из приложения women):

from django.urls import path
from . import views
 
urlpatterns = [
    path('login/', views.login_user, name='login'),
    path('logout/', views.logout_user, name='logout'),
]

Здесь у нас два маршрута. Первый для отображения и обработки формы авторизации пользователя, а второй – для выхода пользователя.

Соответственно, в файле views текущего приложения необходимо прописать функции представления login_user() и logout_user(). Сделаем это пока следующим образом:

def login_user(request):
    return HttpResponse("login")
 
 
def logout_user(request):
    return HttpResponse("logout")

И последним шагом нам нужно связать маршруты в файле users/urls.py с фреймворком Django, то есть, прописать их в файле urls.py пакета конфигурации. Я сделаю это следующим образом:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('women.urls')),
    path('users/', include('users.urls', namespace="users")),
    path("__debug__/", include("debug_toolbar.urls")),
]

Обратите внимание, в функции include() прописан параметр namespace, который позволяет формировать пространство имен для доступа к URL-маршрутам. Например, сейчас для доступа к маршруту

http://127.0.0.1:8000/users/login/

достаточно будет обратиться по его имени с указанием пространства имен users следующим образом:

users:login

Таким образом, мы дополнительно изолируем приложение users от возможных конфликтов в именах маршрутов других приложений.

Однако если сейчас попытаться запустить тестовый веб-сервер, то получим ошибку, что не определена специальная переменная app_name. Она должна присутствовать в файле users/urls.py:

app_name = "users"

После этого веб-сервер должен запуститься и мы видим, что все наши новые маршруты работают. Ну а непосредственно авторизацию мы с вами реализуем на следующем занятии.

Курс по Django: https://stepik.org/a/183363

Видео по теме