django权限管理例子_创建django项目的命令

django权限管理例子_创建django项目的命令前言上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问权限源码分析源码入口:APIView.py文件下的initial方法下的check_per

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

上一篇我们分析了认证的源码,一个请求认证通过以后,第二步就是查看权限了,drf默认是允许所有用户访问
 

权限源码分析

源码入口:APIView.py文件下的initial方法下的check_permissions

def check_permissions(self, request):
    """
    检查是否应允许该请求。如果请求不被允许,则引发适当的异常。
    """
    for permission in self.get_permissions():
        if not permission.has_permission(request, self):
            self.permission_denied(
                request,
                message=getattr(permission, 'message', None),
                code=getattr(permission, 'code', None)
            )

权限在get_permissions方法中获取到,源码如下:

def get_permissions(self):
      """
      实例化并返回此视图所需的权限列表。
      """
      return [permission() for permission in self.permission_classes]

permission_classes又等于api_settings.DEFAULT_PERMISSION_CLASSES,所以我们去settings.py文件中查找

'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ],

我们会发现drf默认的权限是AllowAny,我们去看下源码:

class AllowAny(BasePermission):
    """
    允许任意访问。这不是严格要求的,因为您可以使用空的 permission_classes 列表,但它很有用,因为它使意图更加明确。
    """

    def has_permission(self, request, view):
        return True

我们可以看到AllowAny继承自BasePermission,然后定义了has_permission方法,返回值为True

drf为我们提供了4个系统权限认证:

1. AllowAny
认证规则全部返回True:`return True`
    游客与登录用户都有所有权限

2. IsAuthenticated
认证规则必须有登录的合法用户:`return bool(request.user and request.user.is_authenticated)`
    游客没有任何权限,登录用户才有权限

3. IsAdminUser
认证规则必须是:`return bool(request.user and request.user.is_staff)`
    游客没有任何权限,登录用户才有权限

4. IsAuthenticatedOrReadOnly
    认证规则必须是只读请求或者是合法用户无限制
        return bool(
            request.method in SAFE_METHODS or
            request.user and
            request.user.is_authenticated
        )
        游客只读,合法用户无限制

 

自定义认证类

  1. 创建继承BasePermission的权限类
  2. 实现has_permission方法
  3. 实现体根据权限规则 确定 有无权限
  4. 进行全局或局部配置(一般采用局部配置)

权限规则
满足设置的用户条件,代表有权限,返回True
不满足设置的用户条件,代表有权限,返回False

自定义权限

from django.contrib.auth.models import Group
from rest_framework.permissions import BasePermission


class MyPermissions(BasePermission):
    def has_permission(self, request, view):
        rule1 = request.method in ['GET', 'OPTIONS', 'HEAD']
        group = Group.objects.filter(name="管理员").first()
        groups = request.user.groups.all()
        rule2 = group in groups
        rule3 = group and groups
        return rule1 or (rule2 and rule3)

以上定义了3条规则

  • rule1:请求方法是GETOPTIONSHEAD游客和用户都可以访问
  • rule2:当前用户如果有多个分组,其中必须有一个分组是管理员
  • rule3:管理员分组必须存在,用户必须在分组中

接下里我们定义视图

class TestView(APIView):
    permission_classes = [MyPermissions]

    def get(self, request, *args, **kwargs):
        print(request.user)
        return APIResponse(data_msg="所有用户都可以访问")

    def post(self, request, *args, **kwargs):
        print(request.user)
        return APIResponse(data_msg="只有管理员用户可以访问")

视图中只是添加了permission_classes = [MyPermissions]属与局部配置,也就是自定义的权限只针对此视图,其他视图还是默认的全局配置,如果我们还有其他的关于权限的需求,只需要在自定义的权限类中写逻辑即可

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164878.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Hadoop集群搭建教程(详细)「建议收藏」

    Hadoop集群搭建教程(详细)「建议收藏」需要的安装包:  1.jdk压缩包  2.hadoop压缩包请前往我的github上下载相关安装包开始搭建hadoop集群一.使用VMvare创建两个虚拟机,我使用的是ubuntu16.04版本的因为默认的虚拟机主机名都是ubuntu,所以为了便于虚拟机的识别,创建完成虚拟机后我们对虚拟机名进行修改,我们把用于主节点的虚拟机名称设为master(按自己的喜好创建),把用于从节点的虚拟机名称…

    2025年8月5日
    3
  • InetAddress方法详解[通俗易懂]

    InetAddress方法详解[通俗易懂]Java提供了InetAddress类来代表IP地址,InetAddress下还有两个子类:Inet4Address、Inet6Address,它们分别代表InternetProtocolversion4(IPv4)地址和InternetProtocolversion6(IPv6)地址。

    2022年6月23日
    56
  • AUC的公式_蔡勒公式

    AUC的公式_蔡勒公式AUC:随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。开始抽样:在有M个正样本,N个负样本的数据集里。一共有MN对样本(一对样本即,一个正样本与一个负样本)。统计这MN对样本里,正样本的预测概率大于负样本的预测概率的个数。计算:(一)2个正样本:C,D2个负样本:A,B样本对:(C,A)(C,B…

    2022年10月21日
    2
  • Python中的输出「建议收藏」

    Python中的输出「建议收藏」1.Python的输出语句Python输出语句是print,但是python2.x与3.x又有点区别。python2.x输出print"xxx"能成功执行,而3.x不行,所以

    2022年7月5日
    24
  • 数据结构:树

    数据结构:树

    2021年9月26日
    62
  • Android移动开发-Android数据加密与解密的实现「建议收藏」

    Android移动开发-Android数据加密与解密的实现「建议收藏」数据的安全是非常重要的,现在无论干什么都要账号和密码,一旦账号与密码泄露出去必将造成财产的损失,所以做好数据保密是非常重要的。Android加密算法有多种多样,常见的有MD5、RSA、AES、3DES四种。

    2022年5月16日
    51

发表回复

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

关注全栈程序员社区公众号