使用rest_framework.permissions实现用户认证和授权
使用rest_framework.permissions可以实现用户认证和授权,通过设置不同的权限类来控制用户对特定资源的访问权限。
在Django REST Framework中,可以通过在视图类中使用permission_classes属性来指定要应用的权限类。以下是一个使用rest_framework.permissions实现用户认证和授权的例子:
# serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email']
# views.py
from rest_framework import viewsets, permissions
from django.contrib.auth.models import User
from .serializers import UserSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
# urls.py
from django.urls import include, path
from rest_framework import routers
from .views import UserViewSet
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
urlpatterns = [
path('', include(router.urls)),
]
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}
上述代码中,我们创建了一个简单的用户API,用户可以访问/users来查看、创建、更新和删除用户。在UserViewSet中,我们使用了IsAuthenticated权限类,这意味着用户必须通过身份验证才能访问API。
在settings.py中,我们将SessionAuthentication和BasicAuthentication添加到DEFAULT_AUTHENTICATION_CLASSES中,这意味着用户可以使用会话认证或基本认证进行身份验证。同时,我们设置DEFAULT_PERMISSION_CLASSES为IsAuthenticated,这意味着所有的API视图都需要进行身份验证。
使用上述代码,当用户尝试访问未经身份验证的API时,将会返回401 Unauthorized的错误响应。
如果希望对API中的某些特定视图进行额外的权限检查,可以使用其他权限类。
以下是一个使用rest_framework.permissions的例子,对API中的某些特定视图进行额外的权限检查:
from rest_framework import permissions
class IsAdminOrReadOnly(permissions.BasePermission):
def has_permission(self, request, view):
# 允许GET、HEAD或OPTIONS请求
if request.method in permissions.SAFE_METHODS:
return True
# 仅允许管理员进行其他请求
return request.user and request.user.is_staff
# views.py
from rest_framework import viewsets, permissions
from django.contrib.auth.models import User
from .serializers import UserSerializer
from .permissions import IsAdminOrReadOnly
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAdminOrReadOnly]
在上述示例中,我们创建了一个自定义的权限类IsAdminOrReadOnly,它继承自BasePermission。IsAdminOrReadOnly权限类允许GET、HEAD或OPTIONS请求的所有用户访问,但只有管理员才能进行其他请求。
在UserViewSet中,我们将IsAdminOrReadOnly添加到permission_classes中,这意味着用户必须通过身份验证并具有管理员权限才能进行POST、PUT或DELETE请求。
通过使用rest_framework.permissions,我们可以轻松实现用户认证和授权,保护API资源不被未经授权的用户访问。可以根据实际需求使用不同的权限类来控制API的访问权限。
