Python| Django中具有自定义权限的用户组
让我们考虑一下旅行预订服务,它们如何与不同的计划和套餐一起工作。有一份由公司提供的订阅者订阅不同套餐的产品列表。通常,他们遵循的想法是不同产品的分层分布。
让我们看看旅游预订服务提供的不同套餐:
- 入门计划:在此套餐中,订户将获得非空调巴士旅行和仅在非空调房间内停留 1 天的设施。假设这次旅行是从德里到哈里瓦(北阿坎德邦的一个宗教场所)。
- 黄金计划:它会比入门计划贵一些。在此计划中,订户将在非空调房间内入住 2 天,乘坐空调巴士,行程将从德里到哈里瓦、瑞诗凯诗和马苏里。
- 钻石计划:这是最昂贵的计划,其中订户将获得 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...
迁移上面编写的模型后,我们有两个选项可以创建组。
- Django 管理面板:在管理面板中,您将看到以粗体显示的组,单击该组并创建 3 个不同的组,名为 level0、level1、level3。另外,根据需要定义自定义权限。
- 通过以编程方式创建具有权限的组:使用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/