首页 > 其他分享 >【15.0】DRF之权限控制

【15.0】DRF之权限控制

时间:2023-08-01 12:12:17浏览次数:48  
标签:15.0 角色 用户 auth django user 权限 DRF

【一】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', '[email protected]', '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来隐藏首页上的一些信息展示。

标签:15.0,角色,用户,auth,django,user,权限,DRF
From: https://www.cnblogs.com/dream-ze/p/17596111.html

相关文章

  • android 自定义权限问题
    读懂Android(1):使用Android内部的DownloadProvider下载文件,并获取cache权限  --未审核  收藏Android内部提供了一个DownloadProvider,是一个非常完整的下载工具,提供了很好的外部接口可以被其他应用程序调用,来完成下载工作。同时也提供和很好的下载、通知、存储等机......
  • Android permission 访问权限大全
    Androidpermission访问权限大全AndroidAndroidpermission0Commentsandroidmanifest.xml中声明相关权限请求,完整列表如下:android.permission.ACCESS_CHECKIN_PROPERTIES允许读写访问”properties”表在checkin数据库中,改值可以修改上传(Allowsread/writeaccess......
  • 【11.0】DRF之过滤排序分页
    【准备数据】模型fromdjango.dbimportmodels#Createyourmodelshere.classBook(models.Model):name=models.CharField(max_length=32)price=models.IntegerField()序列化类#-*-coding:Utf-8-*-#@File:book_serializer.py#author:Chi......
  • 【12.0】DRF之全局异常处理
    【一】引入在前端开发中,为了便于处理后端报错,通常需要后端返回统一的格式。通过统一的格式,前端可以更方便地处理后端返回的错误信息比如根据错误码展示不同的提示信息给用户。{code:999,msg:'系统异常,请联系系统管理员'}//其中code表示错误码,msg表示错误信息。只要......
  • 【13.0】DRF之接口文档
    【一】引入后端把接口写好后登录接口注册接口查询所有图书带过滤接口前端人员需要根据接口文档,进行前端开发前后端需要做对接---->对接第一个东西就是这个接口文档--->前端照着接口文档开发后端编写接口:后端团队负责设计和实现系统中的各个接口,根据业务需求完......
  • 配置samba-解决samba没有写权限的问题
    其他配置过程不重复写了,用户名添加好后,添加如下配置到/etc/samba/smb.conf可解决没有写权限的问题[usr_name]path=/home/usr_nameavailable=yesvalidusers=usr_namewriteable=yesguestok=yesbrowseable=yescreatemask=0664directorymask=......
  • DRF之Request常用参数
    登录成功,将token封装好返回给前端,前端再放到locallsession里永久化存储。导航守卫拿到token后就进行第一层守卫防止没登录用户通过。再由拦截器进行校验。这个请求头'Authorization'主浊JWT搞得那个加密token,后端就是要校验这个玩意儿我想。获取时在jwtauth里加上HTTP_就OKjwt其实......
  • DRF补充
    序列化器性别的返回  fromdjango.core.validatorsimportRegexValidator正则校验的导入代码之后就在这里进行使用code=serializers.CharField(required=True,validators=[RegexValidator(r"\d{4}",message="格式错误")]) day13defcreate(self,validated_data):......
  • DRF之APIView全笔记
    一.APIView基本视图,所有的都用这个来作viewsetmixin主要管as_view{}里的调配让视图不再需要两个类二.通用视图GenericAPIView(rest_framework.viewsets)GenericAPIView一共五个功能,数据库获取、分页、序列化、getobject\还有frilter_queryset__东西挺多的主要管self.get_object......
  • sudo相关权限
    使用sudo命令可以模拟其他用户执行其权限。这样你可以在不知道目标用户密码的情况下,以该用户的身份执行特定的命令或操作。下面是使用sudo模拟其他用户执行的方法:sudo-u目标用户命令在上述命令中,你需要将目标用户替换为你要模拟执行的实际用户名,而命令则是你要执行的特定命......