Я не использую никаких методов аутентификации для входа в Django. Я использую эту функцию, это правильно?
'''
def login_action(request):
if request.method != "POST":
return HttpResponse("<h2>Method Not Allowed</h2>")
else:
user = Admin_user.objects.get(email_id=request.POST.get('email'), password=request.POST.get('password'))
if user!=None:
return HttpResponse("Loged IN")
else:
return HttpResponse("Not a User")
'''
Этот метод работает для меня, правильный ли это метод. Я не использую метод аутентификации, потому что мои модели имеют 5 типов пользователей. Может ли кто-нибудь предложить мне метод для 5 типов пользователей, если мой метод не подходит. Есть ли какие-либо проблемы безопасности при использовании этого метода
Вам следует использовать систему аутентификации Django, а не пытаться создать свою собственную. Если вам нужны различные типы пользователей, то вы можете создать профили пользователей, которые связаны с моделью пользователя.
https://docs.djangoproject.com/en/4.0/topics/auth/default/#authenticating-users
В User.model
Django предусмотрено поле groups
.
Groups -Django Docs используют его для объявления определенных типов/групп пользователей. Если у вас есть дополнительные пользовательские модели пользователей, я бы рекомендовал использовать User.primary_key
в ваших пользовательских моделях других пользователей в качестве внешнего ключа.
У меня была такая же проблема, но чтобы сохранить безопасность и хорошую организацию, я использовал обычную сборку Django в представлении аутентификации.
from django.contrib.auth import views as auth_views
urlpatterns = [
path('', auth_views.LoginView.as_view(template_name='authentification/client_login.html',
redirect_authenticated_user=True,next_page='client-home'), name='client-log-in'),]
и затем я создал декоратор костюма, чтобы проверить, разрешено ли пользователю вводить запрашиваемый url.
from django.shortcuts import redirect
from django.urls import reverse
from django.contrib.auth import logout
from django.contrib import messages
from django.utils.translation import gettext_lazy as _
def authorization(view_func) :
def wrapper_func(request, *args, **kwargs):
# import the urls for each user
from CLIENT_A.urls import urlpatterns as client_a_urls
from CLIENT_B.urls import urlpatterns as client_b_urls
# check if the requested url exist in the client_a_urls
if request.resolver_match.view_name in [client_a_urls[i].name for i in range(len(client_a_urls))]:
# now we can check all the authorizations we want and take actions
if not request.user.is_authenticated :
messages.error(request, _('Pour accéder à cette page, vous devez d\'abord être connecté.'))
return redirect(reverse('client-log-in'))
if request.user.is_superuser or request.user.is_client_b or not request.user.is_client_a:
logout(request)
messages.warning(request, _('Vous n\'êtes pas autorisé à accéder à cette page!'))
return redirect(reverse('client-log-in'))
# if user pass all the tests he's allowed to access the view
return view_func(request, *args, **kwargs)
if request.resolver_match.view_name in [client_b_urls[i].name for i in range(len(client_b_urls))]:
# we can do the same for client_b
pass
Использовать этот декоратор довольно просто :
from YourProject.decorators import authorization
@authorization
def Client_a_home(request):
return render(request, 'application/dashboard/client_dashboard.html')