zoukankan      html  css  js  c++  java
  • 权限组件

    权限组件

    重点

    1 权限规则

    2 如何自定义权限

    3 我们一般在视图类中局部配置 drf 提供的权限类,但是也会自定义权限类完成局部配置

    自定义权限类

    1 自定义权限类,继承 BasePermission 类

    2 必须重写 def has_permission(self, request, view): 方法

    ​ 设置权限条件,条件通过,返回 True: 有权限

    ​ 设置权限条件,条件失败,返回 False: 无权限

    3 drf 提供的权限类:

    AllowAny:匿名与合法用户都可以

    IsAuthenticated:必须登录,只有合法用户可以

    IsAdminUser:必须是admin后台用户

    IsAuthenticatedOrReadOnly:匿名只读,合法用户无限制



    系统权限类使用

    图书接口:游客只读,用户增删改查权限使用

    from rest_framework.permissions import IsAuthenticatedOrReadOnly
    class BookViewSet(ModelViewSet):
        # 游客只读,用户可增删改查
        permission_classes = [IsAuthenticatedOrReadOnly]
    
        queryset = models.Book.objects.all()
        serializer_class = serializers.BookSerializer
    


    权限组件项目使用:VIP 用户权限

    数据准备

    """
    1)User表创建两条数据
    2)Group表创建一条数据,name叫vip
    3)操作User和Group的关系表,让1号用户属于1号vip组
    """
    

    permission.py

    from rest_framework.permissions import BasePermission
    
    from django.contrib.auth.models import Group
    class IsVipUser(BasePermission):
        def has_permission(self, request, view):
            if request.user and request.user.is_authenticated:  # 必须是合法用户
                try:
                    vip_group = Group.objects.get(name='vip')
                    if vip_group in request.user.groups.all():  # 用户可能不属于任何分组
                        return True  # 必须是vip分组用户
                except:
                    pass
    
            return False
    

    views.py

    from .permissions import IsVipUser
    class CarViewSet(ModelViewSet):
        permission_classes = [IsVipUser]
    
        queryset = models.Car.objects.all()
        serializer_class = serializers.CarSerializer
    

    serializers.py

    class CarSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Car
            fields = ('name', )
    

    urls.py

    router.register('cars', views.CarViewSet, 'car')
    


    特殊路由映射的请求

    实现用户中心信息自查,不带主键的 get 请求,走单查逻辑

    urls.py

    # 用路由组件配置,形成的映射关系是 /user/center/ => list  |  user/center/(pk)/ => retrieve
    # router.register('user/center', views.UserCenterViewSet, 'center')
    
    urlpatterns = [
        # ...
        # /user/center/ => 单查,不能走路由组件,只能自定义配置映射关系
        url('^user/center/$', views.UserCenterViewSet.as_view({'get': 'user_center'})),
    ]
    

    views.py

    from rest_framework.permissions import IsAuthenticated
    from rest_framework.response import Response
    class UserCenterViewSet(GenericViewSet):
        permission_classes = [IsAuthenticated, ]
        queryset = models.User.objects.filter(is_active=True).all()
        serializer_class = serializers.UserCenterSerializer
    
        def user_center(self, request, *args, **kwargs):
            # request.user就是前台带token,在经过认证组件解析出来的,
            # 再经过权限组件IsAuthenticated的校验,所以request.user一定有值,就是当前登录用户
            serializer = self.get_serializer(request.user)
            return Response(serializer.data)
    

  • 相关阅读:
    数据结构实验之图论六:村村通公路
    数据结构实验之图论二:基于邻接表的广度优先搜索遍历
    数据结构实验之图论二:基于邻接表的广度优先搜索遍历
    树结构练习——判断给定森林中有多少棵树
    树结构练习——判断给定森林中有多少棵树
    图结构练习——最短路径
    图结构练习——最短路径
    【郑轻】[1778]和尚特烦恼4——有多少战斗力
    【郑轻】[1778]和尚特烦恼4——有多少战斗力
    【郑轻】[1776]和尚特烦恼2——第几个素数
  • 原文地址:https://www.cnblogs.com/kai-/p/12363198.html
Copyright © 2011-2022 走看看