权限组件
Posted kai-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了权限组件相关的知识,希望对你有一定的参考价值。
权限组件
重点
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)
以上是关于权限组件的主要内容,如果未能解决你的问题,请参考以下文章