Django : Как проверить, есть ли у пользователя права или нет на Url

Я новичок в django. На моем сайте, когда пользователь входит в систему, он перенаправляется на страницу с выпадающим меню, где он должен выбрать контракт, над которым он хочет работать. После выбора контракта он перенаправляется на конкретную домашнюю страницу define со значением pk в url.Значение pk происходит от ID контракта в базе данных.

Как проверить функцией или декоратором, что у пользователя есть права на этот ID. Потому что любой пользователь может правильно написать цифры в url и получить доступ к странице.

Вот мой вид выпадающего меню :

@authenticated_user
def selectcontrat(request) :

    context = initialize_context(request)
    form_client = SelectClient(request.POST, user=request.user)
    if form_client.is_valid():
        id_contrat = request.POST.get("ID_Customer")
    
        return redirect(reverse('home', args=(id_contrat,)))

    context['form_client'] = form_client

    return render(request, 'base/selectcontrat.html', context)

Вот виды домашней страницы :

@authenticated_user
def home(request, id_contrat=None):
    context = initialize_context(request)

    return render(request, 'home.html', context)

Урлы :

from django.urls import path from . import views

urlpatterns = [
    path('home/<int:id_contrat>/', views.home, name="home"),
    path('', views.loginAD, name="login"),
    path('signin', views.sign_in, name='signin'),
    path('callback', views.callback, name='callback'),
    path('selectcontrat', views.selectcontrat, name='selectcontrat')

Модель - это отношение между пользователем и группой. в какую группу входит пользователь.

class TblAadJntGroupmember(models.Model):
    id = models.AutoField(db_column='ID', primary_key=True)  # Field name made lowercase.
    id_aadgroup = models.IntegerField(db_column='ID_AADGroup', blank=True, null=True)  # Field name made lowercase.
    id_aaduser = models.IntegerField(db_column='ID_AADUser', blank=True, null=True)  # Field name made lowercase.
    createdon = models.DateTimeField(db_column='CreatedOn', blank=True, null=True)  # Field name made lowercase.
    createdby = models.CharField(db_column='CreatedBy', max_length=255, blank=True, null=True)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'tbl_AAD_jnt_GroupMember'

У кого-нибудь есть идея?

При использовании представлений на основе классов вы можете использовать UserPassesTestMixin

from django.contrib.auth.mixins import UserPassesTestMixin

class MyView(UserPassesTestMixin, View):

    def test_func(self):
        return self.request.user.email.endswith('@example.com')

при использовании функциональных представлений можно использовать декоратор user_passes_test.

from django.contrib.auth.decorators import user_passes_test

def email_check(user):
    return user.email.endswith('@example.com')

@user_passes_test(email_check)
def my_view(request):
    ...

Я сделал декоратор, который запрашивает различные базы данных для проверки прав

Вот декоратор

def check_user_rights():
    def wrapper_func(view_func):
        @wraps(view_func)
        def wrapper(request, *args, **kwargs):
           
            # THE ID THAT I CAN COLLECT
            ID_contrat = kwargs["id_contrat"]
            User_ID = request.user.id
            
            # THE SQL REQUEST TO GET THE VALUE
            list_user_rights = AADJNTGroup.objects.filter(ID_User_id=User_ID).values_list('ID_Group_id', flat=True)
            ID_contrat_list = list(list_user_rights)
            Contrat_right = Groups.objects.all().filter(ID__in=ID_contrat_list).values_list('IDCustomer', flat=True)
            
            # Compare the rights
            if ID_contrat in Contrat_right :
                return view_func(request, *args, **kwargs)  

            else :
                return HttpResponse("<h1> page not found</H1>")
            
        return wrapper
    return wrapper_func
Вернуться на верх