Django-权限模块(1)RBAC介绍

2025-09-19

基础概念

RBAC,Role-Based Access Control,直译似乎是基于角色的权限控制。

如果直接分配给用户user,那么50个销售就要分配50次,这也太蠢了。所以如果我们定义一个销售角色role,然后只要给这个角色分配一次权限,来多少销售都直接赋予他们这个角色就可以,突然想到类和实例……

**用户 User:**系统的使用者。

**角色 Role:**一个权限的集合,往往代表一类职责或者岗位。

**权限 Permission:**对系统资源的具体操作许可,是权限控制的最小单元。

RBAC扩展模型

CRM权限管理设计

简单设计四个角色:超级管理员、数据分析员、销售主管、销售。

Django自带的权限管理

Django实际上自带相应的权限管理,之前只是尝试使用了一下,但是并没有深入。这儿简单整理一下。

Django权限系统核心机制是由User、Group和Permission组成,其实就是把角色换成了组的概念。

当我们创建模型,比如我之前创建的客户模型,Django会自动给每个模型创建4个默认权限,增删改查。

这些权限存储在auth_permission表中,并通过content_type_id关联到django_content_type表。

不过Django里面可以把权限直接给用户,这是特殊以及非常细粒度的控制。常规情况下还是通过组来分配权限。

视图装饰器:我们之前在视图里写过一个登录权限啥的,那个装饰器@login_required就是一个权限控制方式。或者@permission_required('crm.change_customer', raise_exception=True),只有具备crm.change_customer权限的用户才能执行这个视图。

基于类的视图混入:

from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin
from django.views.generic import UpdateView

class CustomerUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView):
    model = Customer
    form_class = CustomerForm
    permission_required = 'crm.change_customer'  # 可以是一个权限字符串或列表
    # raise_exception = True  # 默认是 False (重定向到登录页),True 则抛出 PermissionDenied (403)

在模板中检查:

{% if perms.crm.change_customer %}
    <a href="{% url 'edit_customer' customer.id %}">Edit</a>
{% endif %}

← 返回