From d8545bb7cf70ac1bc18f5b7ab3cf65f17f2c6a2b Mon Sep 17 00:00:00 2001 From: Mikan <72257910+Mikan-DS@users.noreply.github.com> Date: Mon, 19 May 2025 17:22:00 +0300 Subject: [PATCH] auth --- requirements.txt | 4 +++- tisbiProFi/settings.py | 30 ++++++++++++++++++++++++++++++ tisbiProFi/urls.py | 1 + users/serializers.py | 22 ++++++++++++++++++++++ users/urls.py | 13 +++++++++++++ users/views.py | 16 ++++++++++++++-- 6 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 users/serializers.py create mode 100644 users/urls.py diff --git a/requirements.txt b/requirements.txt index eb61c0d..b117f31 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,6 @@ django-autoslug transliterate pytest-django pytest -django-filter \ No newline at end of file +django-filter +djangorestframework-simplejwt +djoser \ No newline at end of file diff --git a/tisbiProFi/settings.py b/tisbiProFi/settings.py index 7141711..13c75b3 100644 --- a/tisbiProFi/settings.py +++ b/tisbiProFi/settings.py @@ -10,6 +10,7 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/4.2/ref/settings/ """ import os +from datetime import timedelta from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. @@ -43,6 +44,8 @@ INSTALLED_APPS = [ 'rest_framework', "django_filters", 'drf_yasg', + 'djoser', + 'rest_framework_simplejwt', "core.apps.CoreConfig", 'users.apps.UsersConfig', "employees.apps.EmployeesConfig", @@ -171,4 +174,31 @@ REST_FRAMEWORK = { "PAGE_SIZE": 10, "DEFAULT_FILTER_BACKENDS": ["django_filters.rest_framework.DjangoFilterBackend"], + + "DEFAULT_AUTHENTICATION_CLASSES": ( + "rest_framework_simplejwt.authentication.JWTAuthentication", + "rest_framework.authentication.SessionAuthentication", # Сессионная аутентификация + ), + } + +SIMPLE_JWT = { + "ACCESS_TOKEN_LIFETIME": timedelta(minutes=30), + "REFRESH_TOKEN_LIFETIME": timedelta(days=1), +} + +DJOSER = { + "LOGIN_FIELD": "login", # Используем поле login вместо username + "USER_CREATE_PASSWORD_RETYPE": True, + "SET_PASSWORD_RETYPE": True, + "PASSWORD_RESET_CONFIRM_URL": "password/reset/confirm/{uid}/{token}", + "USERNAME_RESET_CONFIRM_URL": "username/reset/confirm/{uid}/{token}", + "ACTIVATION_URL": "activate/{uid}/{token}", + "SEND_ACTIVATION_EMAIL": False, # Отключаем отправку email, если не нужно + "SERIALIZERS": { + "user_create": "users.serializers.AccountSerializer", + "user": "users.serializers.AccountSerializer", + }, +} + + diff --git a/tisbiProFi/urls.py b/tisbiProFi/urls.py index a6edd51..eb116ce 100644 --- a/tisbiProFi/urls.py +++ b/tisbiProFi/urls.py @@ -43,6 +43,7 @@ urlpatterns = [ path('api/v1/events/', include("events.urls")), path('api/v1/outreach/', include("outreach.urls")), path('api/v1/surveys/', include("surveys.urls")), + path('api/v1/users/', include("users.urls")), path('docs/swagger/', schema_view.without_ui(cache_timeout=0), name='schema-json'), path('docs/swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), diff --git a/users/serializers.py b/users/serializers.py new file mode 100644 index 0000000..274a663 --- /dev/null +++ b/users/serializers.py @@ -0,0 +1,22 @@ +from rest_framework import serializers +from djoser.serializers import UserCreateSerializer +from .models import Account, Role + +class RoleSerializer(serializers.ModelSerializer): + class Meta: + model = Role + fields = "__all__" + + +class AccountSerializer(UserCreateSerializer): + role = serializers.PrimaryKeyRelatedField(queryset=Role.objects.all(), required=False) + + class Meta(UserCreateSerializer.Meta): + model = Account + fields = ["id", "login", "role", "is_staff", "is_active", "first_name", "last_name", "middle_name", "phone", "email"] + + def create(self, validated_data): + user = super().create(validated_data) + user.set_password(validated_data["password"]) + user.save() + return user \ No newline at end of file diff --git a/users/urls.py b/users/urls.py new file mode 100644 index 0000000..6d4c62c --- /dev/null +++ b/users/urls.py @@ -0,0 +1,13 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from .views import AccountViewSet, RoleViewSet + +router = DefaultRouter() +router.register(r"users", AccountViewSet, basename="user") +router.register(r"roles", RoleViewSet, basename="role") + +urlpatterns = [ + path("", include(router.urls)), + path("auth/", include("djoser.urls")), + path("auth/", include("djoser.urls.jwt")), +] \ No newline at end of file diff --git a/users/views.py b/users/views.py index 91ea44a..879abbd 100644 --- a/users/views.py +++ b/users/views.py @@ -1,3 +1,15 @@ -from django.shortcuts import render +from rest_framework import viewsets +from rest_framework.permissions import IsAuthenticated +from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView +from djoser.views import UserViewSet as DjoserUserViewSet +from .models import Account, Role +from .serializers import AccountSerializer, RoleSerializer -# Create your views here. +class AccountViewSet(DjoserUserViewSet): + queryset = Account.objects.all() + serializer_class = AccountSerializer + permission_classes = [IsAuthenticated] + +class RoleViewSet(viewsets.ModelViewSet): + queryset = Role.objects.all() + serializer_class = RoleSerializer \ No newline at end of file