我们现在的数据不需要鉴权就需要访问,对于数据的安全性几乎没有,生产环境也不会这么搞,那么如何在我们代码里面实现鉴权呢?也就是访问数据的时候必须要有登录态,我们可以使用JWT
JWT 安装
pip install djangorestframework-jwt
配置JWT
修改**caseplatform\settings.py**,新增DEFAULT_AUTHENTICATION_CLASSES
REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',# 指定每页显示多少'PAGE_SIZE': 2,# 指定使用JWT Token认证'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_jwt.authentication.JSONWebTokenAuthentication',]}
授权
修改**project\views.py**,新增permission_classes
- AllowAny:任意权限
- IsAuthenticated:允许登录后拥有权限
- IsAdminUser:管理员权限
- IsAuthenticatedOrReadOnly:未登录下只允许浏览
添加class ProjectViewSet(viewsets.ModelViewSet):# 一般需要指定queryset、serializer_class类属性queryset = Projects.objects.all()serializer_class = ProjectsModelSerializer# 指定过滤引擎filter_backends = [filters.SearchFilter, filters.OrderingFilter]# 过滤的字段search_fields = ['name', 'desc']ordering_fields = ['name']permission_classes = [permissions.IsAuthenticated]
permission_classes = [permissions.IsAuthenticated]后,用户只能登录后才能访问,我们可以使用postman测试下
创建用户
使用python manage.py createsuperuser,输入用户名、邮箱和密码后,管理员创建成功。
登录
修改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提供的路由
]
**postman 测试登录接口**<br /><a name="28556f07"></a>## 访问数据我们拿到登录成功后的token,访问http://localhost:8001/projects/ 接口,Headers增加`Authorization`KEY,值为`JWT token`,注意,这里JWT 在token前,不然访问不成功。<br /><a name="2f74c21b"></a>## 修改用户登录过期时间**修改**`**caseplatform\settings.py**`**,新增JWT_AUTH **
JWT_AUTH = { ‘JWT_EXPIRATION_DELTA’: datetime.timedelta(seconds=10), # 设置10s过期
}
``
我们可以查看timedelta`源码来修改我们的过期时间
postman测试,发现我们的登录态确实过期了
