我们现在的数据不需要鉴权就需要访问,对于数据的安全性几乎没有,生产环境也不会这么搞,那么如何在我们代码里面实现鉴权呢?也就是访问数据的时候必须要有登录态,我们可以使用JWT

JWT 安装

pip install djangorestframework-jwt
image-20220317162022973.png

配置JWT

修改**caseplatform\settings.py**,新增DEFAULT_AUTHENTICATION_CLASSES

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
  3. # 指定每页显示多少
  4. 'PAGE_SIZE': 2,
  5. # 指定使用JWT Token认证
  6. 'DEFAULT_AUTHENTICATION_CLASSES': [
  7. 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
  8. ]
  9. }

授权

修改**project\views.py**,新增permission_classes

  • AllowAny:任意权限
  • IsAuthenticated:允许登录后拥有权限
  • IsAdminUser:管理员权限
  • IsAuthenticatedOrReadOnly:未登录下只允许浏览
    1. class ProjectViewSet(viewsets.ModelViewSet):
    2. # 一般需要指定queryset、serializer_class类属性
    3. queryset = Projects.objects.all()
    4. serializer_class = ProjectsModelSerializer
    5. # 指定过滤引擎
    6. filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    7. # 过滤的字段
    8. search_fields = ['name', 'desc']
    9. ordering_fields = ['name']
    10. permission_classes = [permissions.IsAuthenticated]
    添加permission_classes = [permissions.IsAuthenticated]后,用户只能登录后才能访问,我们可以使用postman测试下
    image-20220317163327567.png

    创建用户

    使用python manage.py createsuperuser,输入用户名、邮箱和密码后,管理员创建成功。
    image-20220317163501855.png

    登录

    修改caseplatform\urls.py,新增登录路由 ```python from rest_framework_jwt.views import obtain_jwt_token from django.contrib import admin from django.urls import path, include

urlpatterns = [ path(‘admin/‘, admin.site.urls), path(‘’, include(‘project.urls’)), path(‘login/‘, obtain_jwt_token) # obtain_jwt_token是django提供的路由

]

  1. **postman 测试登录接口**<br />![image-20220317163934881.png](https://cdn.nlark.com/yuque/0/2022/png/1700290/1651221590323-9a0bba13-8af3-4bae-9dbf-0d8b7cbdafd9.png#clientId=uf7893a21-d782-4&from=drop&id=u8cf3afdd&originHeight=663&originWidth=1184&originalType=binary&ratio=1&rotation=0&showTitle=false&size=66073&status=done&style=none&taskId=ud589f19b-bfce-4fb0-9e24-64873245973&title=)
  2. <a name="28556f07"></a>
  3. ## 访问数据
  4. 我们拿到登录成功后的token,访问http://localhost:8001/projects/ 接口,Headers增加`Authorization`KEY,值为`JWT token`,注意,这里JWT 在token前,不然访问不成功。<br />![image-20220317164358637.png](https://cdn.nlark.com/yuque/0/2022/png/1700290/1651221615740-7f8c3565-4098-4cb8-8393-8a4afd87e383.png#clientId=uf7893a21-d782-4&from=drop&id=u9f1ff7c6&originHeight=776&originWidth=1073&originalType=binary&ratio=1&rotation=0&showTitle=false&size=69679&status=done&style=none&taskId=u613a0693-b5ec-46df-9507-c9489ab0c35&title=)
  5. <a name="2f74c21b"></a>
  6. ## 修改用户登录过期时间
  7. **修改**`**caseplatform\settings.py**`**,新增JWT_AUTH **

JWT_AUTH = { ‘JWT_EXPIRATION_DELTA’: datetime.timedelta(seconds=10), # 设置10s过期

} `` 我们可以查看timedelta`源码来修改我们的过期时间
image-20220317165901439.png
postman测试,发现我们的登录态确实过期了
image-20220317165921357.png