Django每个模型的授权权限



我在Django中遇到了一个授权权限的问题(对Django来说有点新)。我有老师、学生和管理者的模式。当老师向我的API发送请求时,他们应该获得与学生不同的权限(即,学生将看到自己所有的考试成绩,而老师可以看到自己班级的所有学生,而经理可以看到所有内容)。

我的问题如下:

  1. 我如何使我所有的模型有效的系统用户?我试过添加
models.OneToOneField(User, on_delete=models.CASCADE)

但这需要创建一个用户,然后将其分配给教师。我想要的是实际的教师实例。被使用的用户。

  1. 如何查看哪一种"类型"是我的用户吗?如果他们是老师、学生还是经理?我是否需要在每次用户发送请求时查看所有3个表,并找出它们属于哪一个?听起来不对。我想创建一个全局"用户"表,类型为";"列,但我不能添加特定的列到我的模型(即学生应该有一个平均成绩,而老师不应该)。

请指教。

当您需要多种用户类型时,例如,在您的案例中需要多个角色,如学生、教师、经理等,那么您需要为所有人员分配不同的角色来进行分类。要拥有这些角色,您需要为User模型扩展models.py中的AbstractUser(简单来说)。您还可以在模型中指定权限。使用permissions字段在模型的class Meta上附加权限。您可以根据需要指定尽可能多的权限,但它必须在像下面这样的元组中:

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.db.models.fields.related import ForeignKey
from django.utils.translation import gettext as _

class Role(models.Model):
STUDENT = 1
TEACHER = 2
MANAGER = 3
ROLE_CHOICES = (
(STUDENT, 'student'),
(TEACHER, 'teacher'),
(MANAGER, 'manager'),
)
id = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, primary_key=True)
def __str__(self):
return self.get_id_display()
class User(AbstractUser):
roles = models.ManyToManyField(Role)
username = models.CharField(max_length = 50, blank = True, null = True, unique = True)
email = models.EmailField(_('email address'), unique = True)
native_name = models.CharField(max_length = 5)
phone_no = models.CharField(max_length = 10)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username', 'first_name', 'last_name']
def __str__(self):
return "{}".format(self.email)
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name='students')
sample_field_name = models.CharField(max_length = 50, blank = True, null = True)
class Meta:
permissions = (("sample_permission", "can change sth of sth"),)

class Teacher(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name='teachers')
sample_field_name = models.CharField(max_length = 50, blank = True, null = True)
class Meta:
permissions = (("sample_permission", "can change sth in sth"),)
class Manager(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name='managers')
sample_field_name = models.CharField(max_length = 50, blank = True, null = True)
class Meta:
permissions = (("sample_permission", "can change sth in sth"),)

之后,你应该对你的视图有自己的权限,添加权限来限制一个函数只对拥有特定权限的用户使用,可以通过Django内置的装饰器permission_required来完成::

from django.contrib.auth.decorators import permission_required
@permission_required('students.sample_permission')
def student_sample_view(request):
"""Raise permission denied exception or redirect user"""

如果你使用的是基于类的视图,你只需要使用mixin,PermissionRequiredMixin:

from django.contrib.auth.mixins import PermissionRequiredMixin
from django.views.generic import ListView
class SampleListView(PermissionRequiredMixin, ListView):
permission_required = 'students.sample_permission'
# Or multiple permissions
permission_required = ('students.sample_permission', 'teachers.other_sample_permission')

这是你在Django项目中管理多个角色的一种方式,你也可以在下面的博客和参考资料中找到更多的方法:

  • 如何在Django中实现多用户类型

  • 管理Django中的用户权限

  • 使用Django的用户模型支持多个角色

  • Django角色、组和权限介绍

  • django-multiple-user-types-example GitHub repository

最新更新