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

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

基础概念

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

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

用户 User:系统的使用者。

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

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

RBAC扩展模型

  • RBAC1-角色继承 Role Hierarchy
    • 角色之间可以存在继承关系,子角色可以继承父角色的所有权限(和类高度相似……)
    • 避免了重复分配权限,设计更优雅。
  • RBAC2-责任分离规则 Constraints
    • 引入了一些约束条件来保证安全。
    • 角色互斥:同一个用户不能被赋予两个互斥的角色。(这个和实例不一样了)
    • 基数约束:一个角色被分配用户数量有限。
    • 先决条件角色:要分配角色A,用户必须已经拥有角色B。
  • RBAC3-RBAC1+RBAC2

CRM权限管理设计

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

  • 超级管理员 Super Admin:
    • 系统拥有者或者核心IT负责人。
    • 管理系统的一切,包括用户账户、角色权限、系统全局设置等等。
  • 数据分析员 Data Analyst:
    • 后台人员,不参与销售过程,但是需要获取数据进行销售分析。
    • 查看、导出、分析公司的销售数据,生成报告,只能看,不能修改。
  •  销售主管 Sales Manager
    • 销售团队管理者。
    • 管理团队成员,查看团队绩效、分配资源、协助下属跟进客户等。
  • 销售人员 Sales Representative:
    • 一个伟大而可怜的一线销售。
    • 跟进客户,推动成交。

Django自带的权限管理

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

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

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

  • add_<modelname>(e.g., add_customer)
  • change_<modelname>(e.g., change_customer)
  • delete_<modelname>(e.g., delete_customer)
  • view_<modelname>(e.g., view_customer)

这些权限存储在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 %}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注