当前位置:   article > 正文

Django系统权限和组的使用_django中的group和权限怎么使用

django中的group和权限怎么使用

目录

一、组Group的使用

1,模拟购买会员,分配组权限

2,用户组权限判断的装饰器

 3,对上传和下载视图进行装饰

二、权限的使用

1,模拟购买会员,分配用户权限

2,用户权限判断的装饰器

3,对上传和下载视图进行装饰


django自带的有权限系统和组功能,对登录用户进行权限判断,下面举例说明模拟一个用户在购买VIP后就获得了上传和下载文件的权限了,能够使用上传和下载文件的功能。

一、组Group的使用

在django创建数据库表时会默认创建用组和权限相关的表:

组的使用过程:获取用户对应的内容类型----创建权限----将权限分配到组----将用户加入到组

前提:需要用户先登录:参考之前的文章,注册账号,并调用登录接口,获取登录接口返回的token  在Django中使用PyJWT实现登录及验证功能-CSDN博客

1,模拟购买会员,分配组权限

  1. class AssignGroupPermissions(View):
  2. """用户购买VIP后,分配用户到相应的组里"""
  3. @method_decorator(decorator_login_require)
  4. def post(self, request):
  5. try:
  6. with transaction.atomic():
  7. save_id = transaction.savepoint()
  8. # 获取权限对应的内容类型
  9. content_type = ContentType.objects.get_for_model(request.user)
  10. # 创建一个名为VIP的用户组
  11. group, create = Group.objects.get_or_create(name="VIP")
  12. # 创建上传和下载的权限
  13. upload_permission, created = Permission.objects.get_or_create(
  14. codename='can_upload',
  15. name='Can Upload',
  16. content_type=content_type
  17. )
  18. download_permission, created = Permission.objects.get_or_create(
  19. codename='can_download',
  20. name='Can Download',
  21. content_type=content_type
  22. )
  23. # 将权限分配到用户组
  24. group.permissions.add(upload_permission, download_permission)
  25. # 将当前登录的用户加入到用户组中
  26. request.user.groups.add(group)
  27. except Exception as e:
  28. # 如果操作失败,回滚事务到保存点
  29. transaction.savepoint_rollback(save_id)
  30. return JsonResponse({"status": 400, "msg": f"用户权限分配失败: {str(e)}"})
  31. else:
  32. # 如果操作成功,提交事务
  33. transaction.savepoint_commit(save_id)
  34. return JsonResponse({'status': 200, 'msg': "用户权限分配成功"})

为视图AssignGroupPermissions配置url后,带着登录返回的token请求url,将会在表中创建权限及加入组等一系列操作:

到此组里有了上传和下载的权限,用户又添加到了组里,所以只要加入到组里的用户都有上传和下载的权限!

2,用户组权限判断的装饰器

  1. def decorator_group_permission_require(func):
  2. """验证登录用户是否有VIP组的相应权限的装饰器"""
  3. def wrapper(request, *args, **kwargs):
  4. authorization = request.META.get('HTTP_AUTHORIZATION', '') # 获取Headers里的Authorization值
  5. if authorization:
  6. payload = parse_payload(authorization) # 解密token
  7. status = payload['status']
  8. if status:
  9. username = payload['data']['username']
  10. user = UserProfile.objects.filter(username=username).first() # 解密后查询
  11. if user:
  12. if user.groups.filter(name='VIP').exists():
  13. # 用户属于 VIP 用户组
  14. return func(request, *args, **kwargs)
  15. else:
  16. return JsonResponse({"status": 401, "msg": "没有VIP组权限"})
  17. else:
  18. return JsonResponse({"status": 401, "msg": payload['error']})
  19. return JsonResponse({"status": 401, "msg": "对不起,您还未登录"})
  20. return wrapper

 3,对上传和下载视图进行装饰

  1. @method_decorator(decorator_group_permission_require, name='dispatch')
  2. class UploadDownloadView(View):
  3. """上传和下载视图"""
  4. def get(self, request):
  5. # 下载的逻辑
  6. return JsonResponse({"status": 200, "msg": "下载成功"})
  7. def post(self, request):
  8. # 上传的逻辑
  9. return JsonResponse({"status": 200, "msg": "上传成功"})

为视图UploadDownloadView配置url后,使用登录接口返回的token登录请求url,在请求前就会判断该登录的用户是否同时有上传和下载的权限访问该视图

使用有组权限的用户访问url测试

请求GET下载

请求POST上传

 使用没有加入到组的其他用户登录时请求url时就报提示没有VIP组的权限

二、权限的使用

上面的权限是用户加入到某一个组里才能拥有组里的权限,现在是直接对某一个用户直接分配一个或多个权限,不再加入到组里

1,模拟购买会员,分配用户权限

  1. class AssignPermissions(View):
  2. """ 用户购买VIP后,分配用户相应的权限"""
  3. @method_decorator(decorator_login_require)
  4. def post(self, request):
  5. try:
  6. with transaction.atomic():
  7. save_id = transaction.savepoint()
  8. # 获取用户对应的内容类型
  9. content_type = ContentType.objects.get_for_model(request.user)
  10. # 创建上传和下载的权限
  11. upload_permission, created = Permission.objects.get_or_create(
  12. codename='can_upload',
  13. name='Can Upload',
  14. content_type=content_type
  15. )
  16. download_permission, created = Permission.objects.get_or_create(
  17. codename='can_download',
  18. name='Can Download',
  19. content_type=content_type
  20. )
  21. # 给当前登录的用户分配上传和下载权限
  22. request.user.user_permissions.add(upload_permission, download_permission)
  23. except Exception as e:
  24. # 如果操作失败,回滚事务到保存点
  25. transaction.savepoint_rollback(save_id)
  26. return JsonResponse({"status": 400, "msg": f"用户权限分配失败: {str(e)}"})
  27. else:
  28. # 如果操作成功,提交事务
  29. transaction.savepoint_commit(save_id)
  30. return JsonResponse({'status': 200, 'msg': "用户权限分配成功"})

2,用户权限判断的装饰器

  1. def decorator_permission_require(func):
  2. """验证登录用户是否有上传和下载的权限的装饰器"""
  3. def wrapper(request, *args, **kwargs):
  4. authorization = request.META.get('HTTP_AUTHORIZATION', '') # 获取Headers里的Authorization值
  5. if authorization:
  6. payload = parse_payload(authorization) # 解密token
  7. status = payload['status']
  8. if status:
  9. username = payload['data']['username']
  10. user = UserProfile.objects.filter(username=username).first() # 解密后查询
  11. if user:
  12. if user.has_perm('users.can_upload') and not user.has_perm('users.can_download'):
  13. # 用户只有上传权限,没有下载权限
  14. if request.method == 'POST':
  15. return func(request, *args, **kwargs)
  16. else:
  17. return JsonResponse({"status": 401, "msg": "没有下载权限"})
  18. elif not user.has_perm('users.can_upload') and user.has_perm('users.can_download'):
  19. # 用户没有上传权限,只有下载权限
  20. if request.method == 'GET':
  21. return func(request, *args, **kwargs)
  22. else:
  23. return JsonResponse({"status": 401, "msg": "没有上传权限"})
  24. elif user.has_perm('users.can_upload') and user.has_perm('users.can_download'):
  25. # 用户同时拥有上传和下载的权限
  26. return func(request, *args, **kwargs)
  27. else:
  28. return JsonResponse({"status": 401, "msg": "没有上传和下载权限"})
  29. else:
  30. return JsonResponse({"status": 401, "msg": payload['error']})
  31. return JsonResponse({"status": 401, "msg": "对不起,您还未登录"})
  32. return wrapper

这里的装饰器对用户的权限进行更加详细的判断,分了为三种情况

3,对上传和下载视图进行装饰

  1. @method_decorator(decorator_permission_require, name='dispatch')
  2. class UploadDownloadView(View):
  3. """上传和下载视图"""
  4. def get(self, request):
  5. # 下载的逻辑
  6. return JsonResponse({"status": 200, "msg": "下载成功"})
  7. def post(self, request):
  8. # 上传的逻辑
  9. return JsonResponse({"status": 200, "msg": "上传成功"})

使用有权限的访问

有三种情况:

有下载没有上传权限

有上传没有下载权限

 请求上传是成功的

没有任何权限 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/494080
推荐阅读
相关标签
  

闽ICP备14008679号