欢迎访问宙启技术站
智能推送

使用rest_framework.permissions实现用户认证和授权

发布时间:2023-12-24 04:01:17

使用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中,我们将SessionAuthenticationBasicAuthentication添加到DEFAULT_AUTHENTICATION_CLASSES中,这意味着用户可以使用会话认证或基本认证进行身份验证。同时,我们设置DEFAULT_PERMISSION_CLASSESIsAuthenticated,这意味着所有的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,它继承自BasePermissionIsAdminOrReadOnly权限类允许GET、HEAD或OPTIONS请求的所有用户访问,但只有管理员才能进行其他请求。

UserViewSet中,我们将IsAdminOrReadOnly添加到permission_classes中,这意味着用户必须通过身份验证并具有管理员权限才能进行POST、PUT或DELETE请求。

通过使用rest_framework.permissions,我们可以轻松实现用户认证和授权,保护API资源不被未经授权的用户访问。可以根据实际需求使用不同的权限类来控制API的访问权限。