Django REST Framework(DRF)框架之认证Authentication与权限Permission

作者:搬砖的石头2024.01.17 19:38浏览量:17

简介:本文将深入探讨Django REST Framework中的Authentication和Permission,解释它们的概念,以及如何使用它们来管理API的访问控制。

Django REST Framework(DRF)是一个强大的工具,用于构建Web APIs。在DRF中,Authentication和Permission是两个核心概念,用于控制对API的访问。

一、Authentication(认证)

Authentication是验证用户身份的过程。在DRF中,你可以使用内置的认证方法,也可以创建自定义的认证方法。最常见的认证方法是基于Token的认证。

1. 基于Token的认证

基于Token的认证是使用JSON Web Tokens (JWT) 进行身份验证。首先,用户通过提供用户名和密码进行登录,然后服务器会生成一个JWT并将其返回给客户端。客户端在随后的请求中包含这个JWT,服务器使用这个JWT来验证用户的身份。
以下是使用JWT进行认证的步骤:

  1. 安装rest_framework_jwt库:pip install rest_framework_jwt
  2. settings.py中配置JWT:
    1. REST_FRAMEWORK = {
    2. 'DEFAULT_AUTHENTICATION_CLASSES': [
    3. 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    4. ]
    5. }
    6. JWT_AUTH = {
    7. 'JWT_SECRET_KEY': 'your-secret-key', # 替换为你的密钥
    8. 'JWT_ALGORITHM': 'HS256',
    9. 'JWT_ALLOW_REFRESH': True,
    10. }
  3. 在需要认证的视图中使用@authentication_classes装饰器:
    1. from rest_framework.decorators import authentication_classes, permission_classes
    2. from rest_framework_jwt.authentication import JSONWebTokenAuthentication
    3. from rest_framework import permissions
    4. @authentication_classes([JSONWebTokenAuthentication])
    5. @permission_classes([permissions.IsAuthenticated])
    6. class MyView(APIView):
    7. # ...
  4. 用户通过提供用户名和密码进行登录,服务器返回JWT。客户端在后续请求中包含这个JWT。

    2. 自定义认证方法

    如果你需要更复杂的认证逻辑,可以创建自定义的认证方法。例如,你可以创建一个认证方法,该方法检查请求头中的API密钥是否有效。
    二、Permission(权限)

Permission是控制对API的访问的机制。DRF提供了多种内置的权限类,也可以创建自定义的权限类。最常见的权限类是IsAuthenticatedIsAdminUser

1. 内置权限类

  • IsAuthenticated: 只有经过身份验证的用户才能访问视图。这是默认的权限类。
  • IsAdminUser: 只有管理员才能访问视图。
  • DjangoModelPermissions: 基于Django模型的权限类。用户必须具有对应模型的权限才能访问视图。
  • DjangoObjectPermissions: 与DjangoModelPermissions类似,但更细粒度,可以基于单个对象进行权限控制。

    2. 自定义权限类

    你可以根据需要创建自定义的权限类。例如,你可以创建一个权限类,该类检查请求中的某些参数是否满足特定条件。
    以下是一个简单的自定义权限类的示例:
    ```python
    from rest_framework import permissions
    class MyCustomPermission(permissions.BasePermission):
    def has_permission(self, request, view):

    自定义权限逻辑,返回True或False

    return request.method == ‘POST’ and request.data.get(‘key’) == ‘my-secret-key’
    在视图中使用自定义权限类:python
    from rest_framework.decorators import permission_classes, authentication_classes
    from rest_framework import permissions, authentication # 导入你的自定义权限和认证类
    from . import MyCustomPermission, MyCustomAuthentication # 导入你的自定义权限和认证类所在的模块(这里假设你的自定义权限和认证类分别在名为“MyCustomPermission”和“MyCustomAuthentication”的模块中)
    ```python