DRF 权限介绍

权限介绍

【1】ACL权限控制

(1)什么是ACL

  • ACL,全称Access Control List,即访问控制列表,是一种用于定义对资源的访问权限的权限控制机制。
  • ACL的主要目的是在提供传统的owner、group、others的read、write、execute权限之外的局部权限设定。
  • 它基于对象与主体之间的关系来控制访问权限,可以直接将权限与用户或用户组相关联,管理员可以直接给用户或用户组授予某些权限。

(2)特点

  1. 灵活性:ACL可以针对单个用户、单个文件或目录进行r、w、x的权限设定,这使得ACL在需要特殊权限的使用情况下特别适用。
  2. 精确性:ACL通过直接关联用户或用户组与权限,实现了对资源访问权限的精确控制。
  3. 适用性:ACL适用于小型和简单系统,其中权限控制较为简单,且角色和权限的变化较少。
  • 虽然ACL提供了灵活的权限管理,但随着系统复杂性的增加,权限管理的复杂性也可能随之增加

(3)示例

image-20240420141905843
  • 用户表 存储了用户的基本信息,如ID、用户名和密码。
  • 权限表 则用于记录每个用户所拥有的权限。这个表格包含了权限的ID、对应的用户ID以及具体的权限名称。
  • 基于这样的权限设置,用户在使用产品时,系统会根据ACL规则来检查他的权限。当他尝试执行增加或删除的操作时,系统会检查权限表,确认用户是否具有相应的权限。如果权限表中存在相应的记录,系统就会允许用户执行这些操作;否则,系统会拒绝他的请求,并可能给出相应的提示信息。
  • 通过这种方式,我们可以实现对用户权限的精确控制,确保只有具备相应权限的用户才能访问特定的功能或数据。这不仅提升了产品的安全性,也提供了更好的用户体验。同时,通过修改权限表的记录,管理员还可以轻松地调整用户的权限,以适应不同的需求和场景。

【2】RBAC权限控制

(1)什么是RBAC

  • RBAC,全称Role-Based Access Control,即基于角色的访问控制,是一种广泛应用于各种系统中的权限控制策略。
  • 其核心思想是将权限分配给角色,再将角色分配给用户,从而实现对系统资源的有效管理和安全控制。在RBAC中,用户通过角色与权限进行关联,一个用户拥有若干角色,每一个角色拥有若干权限,这样就构造成“用户-角色-权限”的授权模型。

(2)特点

  • 灵活性:RBAC允许管理员根据实际需求创建和定义角色,并为角色分配相应的权限。当用户需求发生变化时,管理员只需调整角色的权限,而不需要逐个调整每个用户的权限,从而大大简化了权限管理过程。
  • 继承性:RBAC支持角色之间的继承关系,一个角色可以继承另一个角色的权限。这种继承性有助于简化权限管理的复杂性,减少重复配置的工作量。
  • 细粒度控制RBAC允许对权限进行更细粒度的控制,可以根据需要为角色分配特定的操作权限或数据访问权限。这有助于实现更精确的资源访问控制,提高系统的安全性。
  • 可扩展性:RBAC框架具有良好的可扩展性,可以根据系统的需求进行定制和扩展。管理员可以根据实际情况添加新的角色、权限和用户,以满足系统的不断发展变化。

(3)Django中的权限控制

  • Django的权限控制主要基于用户(User)、组(Group)和权限(Permission)三个核心概念。
  • 在Django中,每个用户都可以属于一个或多个组,每个组可以拥有多个权限。权限通常是与模型(Model)相关联的,可以理解为对某个模型实例的某种操作权限。

image-20240420143558247

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

  • auth_group:存储角色(组)信息的表。每个角色代表一组具有相似职能或权限的用户集合。

  • auth_permission:存储权限信息的表。每个权限对应系统中的具体操作或资源,如“添加用户”、“编辑数据”等。

  • auth_user_groups:用户与组之间的多对多关系表。通过该表,将用户分配给不同的角色(组)。

  • auth_group_permissions:组与权限之间的多对多关系表。通过该表,将权限授予不同的角色(组)。

  • auth_user_user_permissions:用户与权限之间的多对多关系表。虽然通常通过组来管理权限,但有时也需要直接将权限赋予特定的用户。

image-20240420144738329

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

(1)定义权限

  • 在 Django 中,权限是自动根据模型(Model)来定义的。当你创建一个模型时,Django 会为这个模型创建三个默认的权限:添加、修改和删除。例如,如果你有一个名为 BlogPost 的模型,Django 会自动创建以下三个权限:

  • add_blogpost

  • change_blogpost

  • delete_blogpost

  • 如果你想要为模型定义额外的权限,你可以通过在模型的 Meta 类中设置 permissions 属性来实现。例如:

from django.db import models  
  
class BlogPost(models.Model):  
    title = models.CharField(max_length=100)  
    content = models.TextField()  
  
    class Meta:  
        permissions = (  
            ("can_publish", "Can publish blog post"),  
        )
  • 在这个例子中,我们为 BlogPost 模型定义了一个额外的权限 can_publish

(2)授予权限

  • 权限可以通过两种方式授予给用户:直接授予用户,或者通过角色(组)授予用户。

  • 直接授予用户

    • 你可以使用 user_obj.user_permissions.add() 方法将权限直接授予给用户。例如:
from django.contrib.auth.models import Permission  
from django.contrib.auth import get_user_model  
  
# 获取权限对象  
permission = Permission.objects.get(codename='can_publish')  
  
# 获取用户对象  
user = get_user_model().objects.get(username='someuser')  
  
# 将权限授予给用户  
user.user_permissions.add(permission)
  • 通过角色(组)授予用户

  • 首先,你需要创建一个组,并将权限授予给这个组。然后,你可以将用户添加到这个组中。例如:

from django.contrib.auth.models import Group, Permission  
from django.contrib.auth import get_user_model  
  
# 创建一个组  
group = Group.objects.create(name='Editors')  
  
# 获取权限对象  
can_publish_permission = Permission.objects.get(codename='can_publish')  
  
# 将权限授予给组  
group.permissions.add(can_publish_permission)  
  
# 获取用户对象  
user = get_user_model().objects.get(username='someuser')  
  
# 将用户添加到组中  
user.groups.add(group)

(3)验证权限

  • 在 Django 中,你可以使用 user_obj.has_perm() 方法来验证用户是否拥有某个权限。例如:
if request.user.has_perm('blog.can_publish'):  
    # 用户拥有发布博客的权限  
    pass  
else:  
    # 用户没有发布博客的权限  
    pass
  • 你也可以在视图中使用 @permission_required 装饰器来要求用户拥有特定的权限才能访问某个视图。例如:
from django.contrib.auth.decorators import permission_required  
  
@permission_required('blog.can_publish', raise_exception=True)  
def publish_blog_post(request):  
    # 只有拥有发布博客权限的用户才能访问这个视图  
    pass

(4)模板中权限控制

  • 在 Django 模板中,你也可以控制某个元素是否显示给用户,这取决于用户是否拥有特定的权限。你可以使用 {% if perms %} 标签来实现这一点。例如:
{% if perms.blog.can_publish %}  
    <button>发布博客</button>  
{% endif %}
  • 在这个例子中,发布博客 按钮只会在用户拥有 blog.can_publish 权限时显示。

相关推荐

  1. DRF 权限介绍

    2024-04-27 10:04:06       25 阅读
  2. HarmonyOS 权限 介绍

    2024-04-27 10:04:06       43 阅读
  3. Linux普通权限、特殊权限、扩展权限和Umask值介绍

    2024-04-27 10:04:06       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 10:04:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 10:04:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 10:04:06       82 阅读
  4. Python语言-面向对象

    2024-04-27 10:04:06       91 阅读

热门阅读

  1. 如何在ubuntu 24.04上安装配置x11vnc以便远程访问

    2024-04-27 10:04:06       36 阅读
  2. Python pip安装如何切换国内源

    2024-04-27 10:04:06       34 阅读
  3. 【Linux】tr命令删除空格,sed替换空行

    2024-04-27 10:04:06       32 阅读
  4. MyBatis特殊SQL的执行

    2024-04-27 10:04:06       41 阅读
  5. windows Server 2012精讲系列课程

    2024-04-27 10:04:06       27 阅读
  6. Leetcode 347:前K个高频元素

    2024-04-27 10:04:06       22 阅读
  7. Markdown生成word和pdf

    2024-04-27 10:04:06       30 阅读
  8. k8s笔记 | StatefulSet 有状态

    2024-04-27 10:04:06       34 阅读
  9. AI编码prompt编写及内在逻辑

    2024-04-27 10:04:06       30 阅读
  10. 前端CSS基础12(布局)

    2024-04-27 10:04:06       31 阅读