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()]
我只是 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()]