我们现在的数据不需要鉴权就需要访问,对于数据的安全性几乎没有,生产环境也不会这么搞,那么如何在我们代码里面实现鉴权呢?也就是访问数据的时候必须要有登录态,我们可以使用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 />![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=)
<a name="28556f07"></a>
## 访问数据
我们拿到登录成功后的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=)
<a name="2f74c21b"></a>
## 修改用户登录过期时间
**修改**`**caseplatform\settings.py**`**,新增JWT_AUTH **
JWT_AUTH = { ‘JWT_EXPIRATION_DELTA’: datetime.timedelta(seconds=10), # 设置10s过期
}
``
我们可以查看
timedelta`源码来修改我们的过期时间
postman测试,发现我们的登录态确实过期了