📌  相关文章
📜  Python| Django中具有自定义权限的用户组

📅  最后修改于: 2022-05-13 01:55:10.971000             🧑  作者: Mango

Python| Django中具有自定义权限的用户组

让我们考虑一下旅行预订服务,它们如何与不同的计划和套餐一起工作。有一份由公司提供的订阅者订阅不同套餐的产品列表。通常,他们遵循的想法是不同产品的分层分布。

让我们看看旅游预订服务提供的不同套餐:

  1. 入门计划:在此套餐中,订户将获得非空调巴士旅行和仅在非空调房间内停留 1 天的设施。假设这次旅行是从德里到哈里瓦(北阿坎德邦的一个宗教场所)。
  2. 黄金计划:它会比入门计划贵一些。在此计划中,订户将在非空调房间内入住 2 天,乘坐空调巴士,行程将从德里到哈里瓦、瑞诗凯诗和马苏里。
  3. 钻石计划:这是最昂贵的计划,其中订户将获得 3 天计划,包括空调巴士和空调客房住宿,以及哈里瓦、瑞诗凯诗和马苏里之旅以及水上乐园之旅。

我们的主要目标是以一种非常有效的方式(遵循 DRY 原则)为后端设计和编写代码。
在 Django 中有多种实现方法,但最合适和最有效的方法是对用户进行分组并定义这些组的权限。该特定组的用户将自动继承该特定组的权限。让我们先定义 User 模型:

创建一个 Django 应用程序用户。在 models.py 文件中,在“用户”应用目录下,编写此代码。

Python3
# importing necessary django classes
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
from django.db import models
 
# User class
class User(AbstractUser):
 
    # Define the extra fields
    # related to User here
    first_name = models.CharField(_('First Name of User'),
                            blank = True, max_length = 20)
                             
    last_name = models.CharField(_('Last Name of User'),
                            blank = True, max_length = 20)
                             
# More User fields according to need
 
    # define the custom permissions
    # related to User.
    class Meta:
         
        permissions = (
            ("can_go_in_non_ac_bus", "To provide non-AC Bus facility"),
            ("can_go_in_ac_bus", "To provide AC-Bus facility"),
            ("can_stay_ac-room", "To provide staying at AC room"),
            ("can_stay_ac-room", "To provide staying at Non-AC room"),
            ("can_go_dehradoon", "Trip to Dehradoon"),
            ("can_go_mussoorie", "Trip to Mussoorie"),
            ("can_go_haridwaar", "Trip to Haridwaar"),
            ("can_go_rishikesh", "Trip to Rishikesh"),
 
# Add other custom permissions according to need.


Python3
# importing group class from django
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
 
# import User model
from users.models import User
 
new_group, created = Group.objects.get_or_create(name ='new_group')
 
# Code to add permission to group
ct = ContentType.objects.get_for_model(User)
 
# If I want to add 'Can go Haridwar' permission to level0 ?
permission = Permission.objects.create(codename ='can_go_haridwar',
                                        name ='Can go to Haridwar',
                                                content_type = ct)
new_group.permissions.add(permission)


Python
@group_required('level0')
def my_view(request):
    ...


Python
class GroupRequiredMixin(object):
    ...............
    ....Class Definition.....
 
 
class DemoView(GroupRequiredMixin, View):
  group_required = [u'admin', u'manager']
   
  # View code...



迁移上面编写的模型后,我们有两个选项可以创建组。

  1. Django 管理面板:在管理面板中,您将看到以粗体显示的,单击该组并创建 3 个不同的组,名为 level0、level1、level3。另外,根据需要定义自定义权限。
  2. 通过以编程方式创建具有权限的组:使用Python manage.py shell 打开Python shell。

Python3

# importing group class from django
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType
 
# import User model
from users.models import User
 
new_group, created = Group.objects.get_or_create(name ='new_group')
 
# Code to add permission to group
ct = ContentType.objects.get_for_model(User)
 
# If I want to add 'Can go Haridwar' permission to level0 ?
permission = Permission.objects.create(codename ='can_go_haridwar',
                                        name ='Can go to Haridwar',
                                                content_type = ct)
new_group.permissions.add(permission)


我们将以相同的方式为所有三个组设置不同的权限集。在那之前,我们已经创建了组并将其与自定义权限相关联。

现在,检查特定用户是否正在访问适当的功能,例如,限制level0不访问level1 用户level2 用户的功能等等。为此,请检查每个视图函数的权限。
在这里要非常小心,对于基于函数的视图,我们将简单地使用自定义装饰器。

例如 :

Python

@group_required('level0')
def my_view(request):
    ...

有关更多详细信息,请参阅此。
当我们谈论基于类的视图时,事情变得有点复杂,我们不能简单地添加一个装饰器函数,而是我们必须制作一个权限混合类。

例如 :

Python

class GroupRequiredMixin(object):
    ...............
    ....Class Definition.....
 
 
class DemoView(GroupRequiredMixin, View):
  group_required = [u'admin', u'manager']
   
  # View code...

有关更多详细信息,请参阅此。

参考 :
1. https://docs.djangoproject.com/en/1.11/topics/class-based-views/mixins/
2. http://bradmontgomery.blogspot.in/2009/04/restricting-access-by-group-in-django.html
3. https://simpleisbetterthancomplex.com/2015/12/07/working-with-django-view-decorators.html
4. https://micropyramid.com/blog/custom-decorators-to-check-user-roles-and-permissions-in-django/