django-rest-framework教程--认证和权限
程序员文章站
2024-01-06 21:02:28
1. 认证和权限的区别:(1)认证指的是对用户登录的身份进行校验(2)权限指的是一个登录验证通过的用户可以访问哪些接口,或者是对某一个接口可以拿到什么级别权限的数据2. token认证,创建方式有两种(1)使用django manage.py生成token, 前提一定要将token注册到应用中INSTALLED_APPS = [ "rest_framework.authtoken", # DRF自带的Token认证,会生成一张数据表]python manage.py d...
1. 认证和权限的区别:
(1)认证指的是对用户登录的身份进行校验
(2)权限指的是一个登录验证通过的用户可以访问哪些接口,或者是对某一个接口可以拿到什么级别权限的数据
2. token认证,创建方式有两种
(1)使用django manage.py生成token, 前提一定要将token注册到应用中
INSTALLED_APPS = [
"rest_framework.authtoken", # DRF自带的Token认证,会生成一张数据表
]
python manage.py drf_create_token admin
(2)通过django的信号机制自动生成token,views.py中创建生成token的函数
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from django.conf import settings
from rest_framework.authtoken.models import Token
@receiver(post_save, sender=settings.AUTH_USER_MODEL) # django的信号机制
def generate_token(sender, instance=None, created=False, **kwargs):
"""
创建用户时自动生成token
:param sender:
:param instance:
:param created:
:param kwargs:
:return:
"""
if created:
Token.objects.create(user=instance)
(3)django-rest-framework已经帮我们实现了用户拿到自己token的接口函数,我们只需要在跟项目的urls.py文件中增加路由配置即可
from rest_framework.authtoken import views
urlpatterns = [
path("api_auth_token/", views.obtain_auth_token), # 获取token的接口
path('admin/', admin.site.urls),
]
3. 不同的接口使用不同的认证方式
(1)函数式编程实现,注意:认证装饰器要放在api_view装饰器的下方
from rest_framework.decorators import api_view
from rest_framework.decorators import authentication_classes
from rest_framework.authentication import BasicAuthentication, SessionAuthentication, TokenAuthentication
# 一、函数式编程 Function Based View
@api_view(["GET", "POST"])
@authentication_classes((BasicAuthentication, ))
def course_list(request):
"""
获取所有课程信息或新增一个课程
:param request:
:return:
"""
pass
由此得出结论:接口上的认证设置高于全局的认证设置
(2)类视图、通用类视图、DRF的视图集如何单独设置认证方式, 只需要在类里面增加一个类属性即可实现:
from rest_framework.views import APIView
from rest_framework.authentication import BasicAuthentication, SessionAuthentication, TokenAuthentication
class CourseList(APIView):
authentication_classes = [TokenAuthentication, BasicAuthentication]
4. 权限的设置
(1)常用的权限类,设置权限策略
设置单个函数视图的权限接口类
from rest_framework.decorators import permission_classes
from rest_framework.permissions import IsAuthenticated, AllowAny, IsAdminUser, IsAuthenticatedOrReadOnly
# 一、函数式编程 Function Based View
@api_view(["GET", "POST"])
@authentication_classes((BasicAuthentication, TokenAuthentication))
@permission_classes((IsAuthenticated, ))
def course_list(request):
pass
设置单个类视图、通用类视图、视图集的权限接口类
# 二、类视图 Class Based View
class CourseList(APIView):
authentication_classes = [TokenAuthentication, BasicAuthentication]
permission_classes = [IsAdminUser]
(2)如何自定义对象级别的权限
在应用下面创建一个permissions.py文件,代码如下:
from rest_framework import permissions
class IsOwnerReadOnly(permissions.BasePermission):
"""自定义权限,只允许对象的所有者编辑(修改、删除)"""
def has_object_permission(self, request, view, obj):
"""
所有的request请求都有读权限,因此一律允许:GET/HEAD/OPTIONS
:param request:
:param view:
:param obj:
:return: bool
"""
if request.method in permissions.SAFE_METHODS:
return True
# 表示对象的所有者才有写权限
return request.user == obj.teacher
类视图中如下:
from .permissions import IsOwnerReadOnly
class GcourseDetail(generics.RetrieveUpdateDestroyAPIView):
"""获取、更新、删除一门课程"""
queryset = Course.objects.all()
serializer_class = CourseSerializer
# 权限
permission_classes = [IsAuthenticated, IsOwnerReadOnly]
本文地址:https://blog.csdn.net/weixin_42289273/article/details/110259503
推荐阅读
-
django-rest-framework教程--认证和权限
-
PHP类成员的访问方式和权限_PHP教程
-
Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs_PHP教程
-
Access入门教程 19.5 设置用户与组的权限和帐号
-
linux基础教程之特殊权限SUID、SGID和SBIT
-
Springboot+SpringSecurity+JWT实现用户登录和权限认证示例
-
SpringBoot和Redis实现Token权限认证的实例讲解
-
Apache Shiro(一)-登录认证和权限管理初识
-
Linux系统中备份和恢复文件权限设置的教程
-
Spring boot 入门(四):集成 Shiro 实现登陆认证和权限管理