【15.0】DRF之权限控制

发布时间 2023-08-01 12:09:34作者: Chimengmeng

【一】ACL的权限控制

  • ACL(访问控制列表)是一种用于权限控制的技术,可以限制用户对系统资源的访问和操作。
  • 在针对互联网用户的产品中,ACL被广泛应用于管理用户对特定功能或数据的权限。
  • ACL(访问控制列表)的权限控制:(针对互联网用户的产品)
用户表
id    name      password
1     zhangsan   123
权限表
id   user_id    权限
1     1         评论权限
2     1          发抖音权限
张三:[评论权限,发抖音权限]
  • 在给出的示例中,存在一个用户表和一个权限表,以及一个用户张三。
    • 用户表包含用户的基本信息,如ID、用户名和密码。
    • 权限表包含了权限的信息,包括ID、用户ID和具体权限名称。
  • 根据权限表中的记录
    • 我们可以得知张三具有评论权限和发抖音权限。
    • 这意味着张三可以评论和发抖音。
  • ACL的工作原理是对每个用户进行身份认证,并根据其身份分配相应的权限。
    • 当用户尝试执行某个操作时,系统会通过检查ACL来确定该用户是否具有执行该操作的权限。
    • 如果用户具有相应的权限,则操作将被允许;否则,将被拒绝。
  • ACL能够有效地管理用户对系统资源的访问权限,帮助确保只有授权用户可以执行特定的操作。
    • 通过仔细设计和配置ACL,可以保护系统的安全性,并防止未经授权的访问和滥用。

【二】RBAC基于角色的访问控制

  • RBAC(Role-Based Access Control)基于角色的访问控制:(针对于公司内部项目)

  • 权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。

    • 这就极大地简化了权限的管理。
    • 这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便
  • django的auth其实就实现了基于角色的访问控制 ---> 通过表控制的

    • auth_user :用户表,存用户信息

    • auth_group:组,角色,存放角色信息

    • auth_permission:权限,存放权限信息

      • 分析:一个组(角色)中,有多个用户,一个用户,属于多种角色----》多对多
    • auth_user_groups:用户和组的多对多中间表

      • 分析:一个组,可能有多个权限,一个权限,也可能属于多个组---》多对多
    • auth_group_permissions:组和权限的多对多中间件

      • django,多了张表:auth_user_user_permissions
      • 分析:一个用户,可以有多个权限,一个权限,可以分配个多个用户---》多对多
    • auth_user_user_permissions:用户和权限多对多中间表

  • 基于角色的访问控制(Role-Based Access Control,RBAC)是一种常用的访问控制策略,它将权限与角色相关联,通过将用户分配到适当的角色,来获得该角色所具有的权限。

  • 这种访问控制方式简化了权限的管理,提高了系统的安全性和可管理性。

  • 在RBAC中,主要涉及以下几个表:

    • auth_user

      • 存储用户信息的表。

      • 每个用户在系统中有唯一标识,并包含其登录凭证、个人信息等。

    • auth_group

      • 存储角色(组)信息的表。

      • 每个角色代表一组具有相似职能或权限的用户集合。

      • 例如,可以定义一个"管理员"角色和一个"普通用户"角色。

    • auth_permission

      • 存储权限信息的表。

      • 每个权限对应系统中的具体操作或资源,如"添加用户"、"编辑数据"等。

    • auth_user_groups

      • 用户与组之间的多对多关系表。

      • 通过该表,将用户分配给不同的角色(组)。

    • auth_group_permissions

      • 组与权限之间的多对多关系表。

      • 通过该表,将权限授予不同的角色(组)。

    • auth_user_user_permissions

      • 用户与权限之间的多对多关系表。
      • 通过该表,将权限直接赋予特定的用户。
  • 使用上述表,可以实现基于角色的访问控制。具体步骤如下:

    • 定义角色:

      • 创建auth_group表中的记录,定义不同的角色(组),如"管理员"、"普通用户"等。
    • 确定权限:

      • 创建auth_permission表中的记录,定义系统中的各项权限,如"添加用户"、"编辑数据"等。
    • 分配角色:

      • 通过在auth_user_groups表中创建相应的记录,将用户分配到对应的角色(组)。
    • 授予权限:

      • 通过在auth_group_permissions表中创建记录,将权限授予不同的角色(组)。
    • 直接赋权:

      • 通过在auth_user_user_permissions表中创建记录,将权限直接授予特定的用户。
  • 这样,当用户登录系统时,系统会检查该用户所分配的角色,并根据角色所拥有的权限来限制用户的操作范围。

  • 通过RBAC的机制,可以灵活地管理和控制用户的权限,实现安全的访问控制。

  • 在Django框架中,django.contrib.auth模块提供了RBAC相关的数据模型和方法,方便进行基于角色的访问控制的实现。

【三】Django中的权限控制是如何使用的

【1】定义权限:

  • 首先,您需要定义应用程序中的权限。
  • 这可以通过在 models.py 文件中使用 Django 的 Permission 类来完成。
  • 您可以为每个视图或特定操作定义自己的权限。
from django.contrib.auth.models import Permission

class MyModel(models.Model):
    # 模型字段定义
    
class Meta:
    permissions = [
        ("can_view_mymodel", "Can view My Model"),
        ("can_change_mymodel", "Can change My Model"),
    ]

【2】授予权限:

  • 一旦您定义了权限,您需要将其分配给相应的用户角色或具体的用户。
  • 这可以通过 Django 管理界面或程序代码的方式来完成。
  • 对于管理员用户,您可以在创建用户时直接选择用户的权限。
from django.contrib.auth.models import User, Group
from django.contrib.auth.models import Permission

# 创建用户组
group = Group(name='Editors')
group.save()

# 给用户组分配权限
permission = Permission.objects.get(codename='can_view_mymodel')
group.permissions.add(permission)

# 创建用户并关联用户组
user = User.objects.create_user('john', 'john@example.com', 'password')
user.groups.add(group)

【3】验证权限:

  • 在视图函数或类中,您可以使用 Django 提供的装饰器或 mixin 来验证用户是否具有执行特定操作的权限。
  • 使用装饰器:
from django.contrib.auth.decorators import permission_required

@permission_required('app.can_view_mymodel')
def my_view(request):
    # 视图函数逻辑
  • 使用 mixin 类:
from django.contrib.auth.mixins import PermissionRequiredMixin

class MyView(PermissionRequiredMixin, View):
    permission_required = ('app.can_change_mymodel',)  # 可以是单个权限或多个权限元组
    
    def get(self, request):
        # 视图类逻辑

【4】模板中的权限控制:

  • 在模板文件中,您可以使用 Django 提供的模板标签来控制用户对特定内容的访问权限。
{% if perms.app.can_change_mymodel %}
    <a href="#">Edit</a>
{% endif %}
  • 通过以上步骤,您可以使用 Django 中的权限控制系统来管理用户对应用程序资源的访问和操作权限。
  • 请注意,这只是一个基本示例,您还可以根据具体的应用需求进行进一步的自定义和扩展。

【四】开发中如何做权限控制

  • python开发,公司内部项目多,使用基于角色的访问控制的权限,比较多

  • python+django 开发出一套公司内部项目,要带rbac的权限控制

    • 基于django的auth+admin 快速开发,有更多操作,但是没学
    • 基于django的auth+admin+第三方美化 快速开发
      • 国内的:simple-ui,xadmin(弃用了)
      • 国外的:
    • 基于django+vue+自定制权限
      • djagno-vue-admin :第三方开源
    • 完全自己写
  • 在Python开发中,实现权限控制通常可以使用基于角色的访问控制(Role-Based Access Control,RBAC)。

  • 以下是一些在Python开发中实现RBAC权限控制的方法:

    • 基于Django的auth+admin快速开发:

      • Django框架本身提供了内置的用户认证(auth)和管理后台(admin)功能,可通过对用户、组和权限进行管理来实现RBAC。

      • 可以使用Django提供的装饰器和权限类来限制用户的访问和操作权限。

    • 基于Django的auth+admin+第三方美化快速开发:

      • 为了增强管理后台的样式和功能,可以使用一些第三方库来进行美化,如国内的simple-ui、xadmin(已弃用)以及国外的其他选择。
    • 基于Django+Vue+自定制权限:

      • 结合Django和Vue框架,使用自定义的权限控制方式来实现更加灵活的权限控制机制。一个可行的方案是使用第三方库如django-vue-admin,支持自定义权限的分配和管理。
    • 完全自己写:

      • 如果需要更加细粒度的权限控制或者与其他系统进行深度集成,可以根据具体需求完全自己编写权限控制模块。
  • 总之,在选择权限控制方案时,需要综合考虑项目规模、开发周期、开发者熟悉度以及用户需求等因素。

【五】基于django的auth+admin+第三方美化 快速开发

官方文档:Simple UI | Simple UI (72wo.com)

【1】安装

  • 通过使用pip命令安装django-simpleui库,运行以下命令进行安装:
pip3 install django-simpleui

【2】配置文件配置,注册app

  • 在项目的配置文件中,需要将simpleui添加到INSTALLED_APPS列表中。
  • 打开项目的settings.py文件,在INSTALLED_APPS设置项中添加'simpleui'
  • 如下所示:
INSTALLED_APPS = [
    'simpleui',
    ...
]

【3】菜单栏定制:

  • django-simpleui支持自定义菜单栏。
  • settings.py文件中可以设置SIMPLEUI_CONFIG来进行菜单栏的定制。
  • 可以配置菜单的名称、图标、排序、链接等。
  • 具体配置方法可以参考django-simpleui的官方文档。

【4】自定义菜单和页面:

  • 通过在SIMPLEUI_CONFIG中配置自定义菜单和页面,可以实现对管理后台的更多个性化定制。
  • 可以为不同的用户角色设置不同的菜单和页面展示。

【5】自定义按钮:

  • django-simpleui还支持自定义按钮,可以在页面上添加自定义按钮来扩展管理后台的功能。
  • 可以通过配置SIMPLEUI_CONFIG来添加自定义按钮,自定义按钮的配置方式详见官方文档。

【6】切换图标:

  • settings.py文件中,可以通过设置SIMPLEUI_ICON来更改管理后台菜单栏的默认图标。
  • 可以选择使用Font Awesome等图标库的图标,也可以使用自定义图标。

【7】首页显示的隐藏:

  • django-simpleui还提供了配置首页显示或隐藏的选项。
  • 可以在settings.py文件中设置SIMPLEUI_HOME_INFO,将其设置为False来隐藏首页上的一些信息展示。