Django:如何检查用户是否有权插入 URL - 装饰器中的 pk 值
Django : How do you check if an user has the rights on a pk value inserted in the URL - decorator
我是 django 的新手。在我的网站上,当用户登录时,他会被重定向到一个带有下拉菜单的页面,他必须在该菜单中选择他想要工作的合同。选择合同后,他将被重定向到在 url 中使用 ID 定义的特定主页。 ID值来自合约在数据库中的ID。
什么
我如何通过功能或装饰器检查用户是否有权加入此合同。因为任何用户都可以对 url 中的数字进行右转并访问他不应该访问的页面。例如,用户拥有合同 109 和 144 的权利,因此他可以继续 urls“home/109”和“home/144”,但如果是更改值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)
urls :
从django.urls导入路径
从 。导入视图
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 Groups(models.Model):
ID = models.AutoField(primary_key=True) # Field name made lowercase.
IDCustomer = models.IntegerField(blank=True, null=True) # Field name made lowercase.
GroupName = models.CharField(max_length=255, blank=True, null=True) # Field name made lowercase.
CreatedOn = models.DateTimeField(blank=True, null=True) # Field name made lowercase.
class AADJNTGroup(models.Model):
ID = models.AutoField(primary_key=True)
ID_User = models.ForeignKey(User, on_delete=models.CASCADE)
ID_Group = models.ForeignKey(Groups, on_delete=models.CASCADE)
CreatedOn = models.DateTimeField(auto_now_add=True)
CreatedBy = models.CharField(max_length=255)
为此,我尝试做一个装饰器,但我不知道如何获取在表单后重定向的 id_contrac 值。我怎样才能在装饰器中得到这个值,这样我就可以检查数据库的权限。
装饰器不工作:
def check_pk(view_func) :
def wrapper_func(request, *args, **kwargs):
list_user_rights = AADJNTGroup.objects.filter(ID_group_id=args[0]).values_list('ID_User_id', flat=True)
print(list_user_rights)
return wrapper_func
有人有想法吗?
如果使用基于 class 的视图,您可以使用 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
我是 django 的新手。在我的网站上,当用户登录时,他会被重定向到一个带有下拉菜单的页面,他必须在该菜单中选择他想要工作的合同。选择合同后,他将被重定向到在 url 中使用 ID 定义的特定主页。 ID值来自合约在数据库中的ID。
什么 我如何通过功能或装饰器检查用户是否有权加入此合同。因为任何用户都可以对 url 中的数字进行右转并访问他不应该访问的页面。例如,用户拥有合同 109 和 144 的权利,因此他可以继续 urls“home/109”和“home/144”,但如果是更改值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)
urls :
从django.urls导入路径 从 。导入视图
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 Groups(models.Model):
ID = models.AutoField(primary_key=True) # Field name made lowercase.
IDCustomer = models.IntegerField(blank=True, null=True) # Field name made lowercase.
GroupName = models.CharField(max_length=255, blank=True, null=True) # Field name made lowercase.
CreatedOn = models.DateTimeField(blank=True, null=True) # Field name made lowercase.
class AADJNTGroup(models.Model):
ID = models.AutoField(primary_key=True)
ID_User = models.ForeignKey(User, on_delete=models.CASCADE)
ID_Group = models.ForeignKey(Groups, on_delete=models.CASCADE)
CreatedOn = models.DateTimeField(auto_now_add=True)
CreatedBy = models.CharField(max_length=255)
为此,我尝试做一个装饰器,但我不知道如何获取在表单后重定向的 id_contrac 值。我怎样才能在装饰器中得到这个值,这样我就可以检查数据库的权限。
装饰器不工作:
def check_pk(view_func) :
def wrapper_func(request, *args, **kwargs):
list_user_rights = AADJNTGroup.objects.filter(ID_group_id=args[0]).values_list('ID_User_id', flat=True)
print(list_user_rights)
return wrapper_func
有人有想法吗?
如果使用基于 class 的视图,您可以使用 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