Django-客户管理模块(2)登录权限

2025-09-09

上一节我们做了个简单的客户增删改查。这一节我们来看看怎么增加权限控制。毕竟赤裸裸的把客户信息放在网页上让所有人都能看到,肯定是不合适的。

基础知识(可忽略)

认证(Authentication):确认用户的身份,简单来说就是验证这个人是不是你(比如通过登录获得 token 或 session)。DRF 默认有两种认证方式:

MD,傻逼GPT叽里咕噜说了一大堆,搞得复杂得很,又要装库又要搞setting配置。换了Gemini果然正常多了。下面直接看看代码,我们需要修改什么。

代码

当下很简单,我们在之前的view.py的类里加入一行代码,就这么简单,告诉程序必须是登录的用户才能访问。

permission_classes = [IsAuthenticated] 

整体代码如下:

class CustomersSet(viewsets.ModelViewSet):
    serializer_class = CustomerSerializer
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ["name", "email", "phone", "address"]
    ordering_fields = ["created_at", "updated_at", "name"]
    # 启用 DRF 自带的过滤后端。
    # SearchFilter:允许在 URL 上用 ?search=关键字 来搜索数据。
    # OrderingFilter:允许在 URL 上用 ?ordering=字段名 来排序。
    permission_classes = [IsAuthenticated]  # 加上这行,给 API 上锁!

    def get_queryset(self):
        # 查询函数

        return Customer.objects.all()
        # return Customer.objects.filter(owner=self.request.user)  # 只返回当前用户

    def perform_create(self, serializer):
        serializer.save()
        # perform_create 是 DRF 在执行 create() 方法时会调用的钩子。
        # 默认 serializer.save() 就会把数据存进数据库。

GPT之前叽里咕噜说了一大堆,其实就是在setting里修改。当我们期望这个登录认证是整个项目的默认行为时,就应该去修改 settings.py。DRF一般会默认两种认证方式。

DEFAULT_AUTHENTICATION_CLASSES (默认认证方式)

因为 SessionAuthentication 是默认启用的,所以 API 就认识 Django 的登录状态。

DEFAULT_PERMISSION_CLASSES (默认权限策略)

这就是为什么在添加 permission_classes = [IsAuthenticated] 之前,任何人(无论登不登录)都能访问的客户 API。因为全局默认是不上锁。

OK,现在我们不登陆的话,访问的结果就是这样:

而登陆了,就正常了:


← 返回