Django Rest 中的自定义授权

Custom authorization in Django Rest

我只是 Django 的新手,python。我尝试构建 1 个简单的 API 集合,包括 CRUD 基础、身份验证、授权。

我有 1 个简单的视图,例如:

@api_view(['GET'])
@permission_classes([IsUser])
def get_test(request : Request):
 return JsonResponse({"message": "success"}, status = status.HTTP_200_OK)

并且 IsUser 是:

class IsUser(IsAuthenticated):
  def has_permission(self, request : Request, view):
    token = request.query_params.get('token')
    if token:
      role = jwt.decode(token.split(" ").__getitem__(1), key="secret_key",algorithms="HS256").get('role')
    if role == 'User':
        return True
    else:
        return False
  return False

我的目的是基于此解析 JWT 令牌和授权。不知我的方法是否真的正确?谁能给我一些评论和文档以更好地理解这个问题?我没有使用任何其他库,因为我想首先自己编写代码以了解流程。

谢谢你的帮助。

如果您使用 DRF 的默认 JWT 身份验证,那么权限 class IsAuthenticated 将为您验证令牌,而不是在 headers 中指定的查询参数中指定令牌。

但是,如果您希望允许特定类型(角色)的用户访问您的端点。然后创建 BasePermission class 的子 class,如示例所示。

然后只需在 @permission_classes([IsUser & IsAuthenticated]) 中添加 IsAuthenticated 即可。

同样,这只有在您使用默认 Group 模型时才有效。

这是导入它的方法from django.contrib.auth.models import Group

from rest_framework.permissions import BasePermission

USER = 'USER'

class IsUser(BasePermission):

    def has_permission(self, request, view, user=None):
        if not user:
            user = request.user
        return USER in [role.name for role in user.groups.filter()]