php用户权限代码实例,权限组件(示例代码)

权限组件

重点

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值