首页 > 其他分享 >django搭建平台实战教程三:接口编写及权限校验(前后端分离)

django搭建平台实战教程三:接口编写及权限校验(前后端分离)

时间:2023-11-02 10:38:19浏览次数:29  
标签:教程 group request 校验 django user 权限 class permissions

自定义权限校验

注册增加group_id字段

...
@api_view(['POST'])
def register(request: Request):
    if DUser.objects.filter(username=request.data["username"]).count() > 0:
        return Response({
            "code": 400,
            "msg": "用户已存在"
        })
    user = DUser.objects.create_user(username=request.data["username"], password=request.data["password"])
    user.groups.add(request.data["group_id"])
    return Response({
        "code": 0,
        "msg": "注册成功"
    })

serializers.py

...
class PermissionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Permission
        fields = ['id' ,'url', 'name','content_type','codename']

views.py

...
class PermissionViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Permission.objects.all()
    serializer_class = PermissionSerializer
    permission_classes = [permissions.IsAuthenticated]

urls.py

...
router.register(r'permission', views.PermissionViewSet)

请求/permission/接口能查到所有权限id,和codename

由于Django REST framework的增删改查接口没有权限校验,必须手动写逻辑,在增删改查前校验,是否有权限,使用user.has_perm()方法来判断用户是否已经拥有相应权限。

参数为app的name.codename

...
class DUserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = DUser.objects.all().order_by('-date_joined')
    serializer_class = DUserSerializer
    permission_classes = [permissions.IsAuthenticated]

    def create(self, request, *args, **kwargs):
        user: User = request.user
        print(user.get_group_permissions())
        if user.has_perm("authen.add_duser"):
            return super().create(request, *args, **kwargs)
        else:
            return Response({
            "code": 400,
            "msg": "用户无权限"
        })

    def destroy(self, request, *args, **kwargs):
        user: User = request.user
        print(user.get_group_permissions())
        if user.has_perm("authen.delete_duser"):
            super().destroy(request, *args, **kwargs)
            return Response({
                "code": 200,
                "msg": "删除成功"
            })
        else:
            return Response({
                "code": 400,
                "msg": "用户无权限"
            })

此时请求新增用户和删除用户会提示用户无权限

{ "code": 400, "msg": "用户无权限" }

group视图添加set_permissions方法

...
class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
    permission_classes = [permissions.IsAuthenticated]

    @action(methods=['POST'],detail=True)
    def set_permissions(self,request: Request, pk=None):
        group = self.get_object()
        group.permissions.set(request.data["permissions"])
        return Response({
        "code": 0,
        "msg": "操作成功"
    })

根据/permission/接口查到权限id赋予用户接口增删改查权限

 再次请求添加用户接口

 

 再次请求删除用户接口

 

添加的自定义方法也可以给权限

改写group视图

...
class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
    permission_classes = [permissions.IsAuthenticated]

    @action(methods=['POST'],detail=True)
    def set_permissions(self,request: Request, pk=None):
        user: User = request.user
        print(user.get_group_permissions())
        if user.has_perm("auth.set_group_permissions"):
            group = self.get_object()
            group.permissions.set(request.data["permissions"])
            return Response({
            "code": 0,
            "msg": "操作成功"
        })
        else:
            return Response({
                "code": 400,
                "msg": "用户无权限"
            })

添加set_group_permissions权限

 再请求set_permission接口会提示无权限,通过管理员token请求可成功赋予权限

至此django用户管理及权限验证的后台接口基本后端框架就完成了,还有一些细节需要自己去改进,然后就是选择前端框架编写前端页面。

 

标签:教程,group,request,校验,django,user,权限,class,permissions
From: https://www.cnblogs.com/zerotest/p/17804828.html

相关文章

  • Django实战项目-学习任务系统-查询列表分页显示
    接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。接着优化查询列表分页显示功能,有很多菜单功能都有查询列表显示页面情况,如果数据量多,不分页显示的话,页面展示效果就不太好。本次增加查询列表分页显示功能,对一个查询列表功能进行分页改造,其他依此类推即可。......
  • DiscuzQ官方最新v3.0.220211源码编译搭建教程和官方部署教程,适合二开(已本地编译通过,无
    经过长达半个月的研究!完成这篇DiscuzQ官方最新版本v3.0.220211的源码编译和官方部署教程。适合喜欢二次开发的小伙伴们,已经通过本地编译测试,保证没有任何错误。具体教程在我搭建的dzq(使用二开方法搭建)发布的文章:https://www.abyssdawn.com/thread/4......
  • django搭建平台实战教程二:快速实现用户注册和登录
    这一篇主要使用django框架实现用户注册和登录编写接口并设置URL根目录添加api文件夹,views.py添加register注册视图@api_view(['POST'])defregister(request:Request):ifDUser.objects.filter(username=request.data["username"]).count()>0:returnRespon......
  • PC企业微信hook接口,通过查询添加外部联系人教程
    简要描述通过查询添加为联系人(外部联系人)操作码102008请求说明参数名必选类型说明type是int类型addType是string类型14微信用户1企业用户user_id是string用户idcontent是string添加请求语openid是string标识syncKey是string同步key请求示例{"type":102008,"data":{"a......
  • django搭建平台实战教程一:生成数据库数据
    首先需要创建一个django-rest-framework项目,如何创建可以参考https://www.django-rest-framework.org/tutorial/quickstart/,不再赘述。创建完结构如图所示 settings.py配置mysql数据库...DATABASES={"default":{"ENGINE":"django.db.backends.mysql",......
  • Nodejs安装教程
    1.下载 在https://nodejs.cn/download/current/ 下载安装包,我下载的是  node-v18.18.0-x64.msi2.双击安装包,一路点击下一步,我选择安装到D:\nodejs\ 目录3.验证安装  在cmd命令行窗口中,运行  node-v 及 npm-v 将显示版本号4 修改全局模块下载路径4.1......
  • Django实战项目-学习任务系统-自定义URL拦截器
    接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。首先增加URL拦截器,你不会希望没有登录用户就可以进入用户主页各种功能的,所以增加URL拦截器可以解决这个问题。Django框架本身也有URL拦截器,但是因为本系统用户模型跟Django框架本身用户模型不匹配,所以没有用,......
  • 如何发包到中央仓库-完整教程
    相信很多小伙伴自己都会有一些包,我们可以将包发布中央仓库,然后直接通过maven来使用这些包,下面就整理下如何将包发到中央仓库。新建项目第一步,我们需要在sonatype上注册一个账号,这一步就不再演示了。注册好账户之后,然后我们来创建项目。点击新建按钮,问题类型选择NewProject,如......
  • Docker从了解到部署应用的详细教程
    一、Docker基础知识1、Docker(1)Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可以移植的容器中,然后发布到任何的linux机器上,可以实现虚拟化;(2)Docker容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低;2、Docker的应用场景(1)Web应用的自动化......
  • FreeRTOS深入教程(队列内部机制和源码分析)
    (文章目录)前言本篇文章主要来为大家分析队列的内部机制和源码实现。一、队列结构体分析在FreeRTOS中队列会使用一个结构体来表示:1.int8_t*pcHead和int8_t*pcWriteTo:这些指针指向队列存储区的头部和下一个可写入的位置。队列存储区是一个用于存储队列中数据项的缓冲......