LoopBack ACL失效求助:配置Company模型权限规则
当然有靠谱的解决方案!我之前在项目里刚好落地过几乎一样的权限控制逻辑,给你拆解下具体怎么实现:
核心权限规则梳理
先把需求转化为明确的权限规则,避免逻辑混乱:
- 默认拒绝所有:所有未通过权限校验的请求直接返回403
- 超级管理员豁免:拥有
is_superuser标识的用户,对所有Company对象拥有完整CRUD权限 - 所有者专属权限:已认证的普通用户,仅能对自己作为
owner的Company对象执行CRUD操作
具体代码实现示例(以Django REST Framework为例)
我以常用的DRF框架为例,自定义权限类来实现这套逻辑,你可以根据自己用的框架调整:
1. 自定义Company权限类
from rest_framework.permissions import BasePermission, IsAuthenticated class CompanyPermission(BasePermission): def has_permission(self, request, view): # 第一步:校验用户是否已认证,未认证直接拒绝 if not IsAuthenticated().has_permission(request, view): return False # 超级管理员直接获得所有视图权限 if request.user.is_superuser: return True # 对于列表、创建操作,先放行,后续在视图/序列化器里做细粒度控制 if view.action in ['list', 'create']: return True # 其他操作(详情、更新、删除)需要走对象权限校验 return True def has_object_permission(self, request, view, obj): # 超级管理员对所有对象拥有操作权限 if request.user.is_superuser: return True # 普通用户仅能操作自己拥有的Company对象 return obj.owner == request.user
2. 在视图集里应用权限类
from rest_framework.viewsets import ModelViewSet from .models import Company from .serializers import CompanySerializer from .permissions import CompanyPermission class CompanyViewSet(ModelViewSet): queryset = Company.objects.all() serializer_class = CompanySerializer permission_classes = [CompanyPermission] def get_queryset(self): # 列表视图过滤:普通用户只能看到自己的Company,超级管理员看全部 if self.request.user.is_superuser: return super().get_queryset() return super().get_queryset().filter(owner=self.request.user)
3. 自动设置创建对象的所有者
为了避免用户创建Company时手动指定其他用户为所有者,在序列化器里自动绑定当前登录用户:
from rest_framework import serializers from .models import Company class CompanySerializer(serializers.ModelSerializer): class Meta: model = Company fields = ['id', 'name', 'description', 'owner'] read_only_fields = ['owner'] # 把owner设为只读,禁止前端修改 def create(self, validated_data): # 自动将当前登录用户设为新Company的所有者 validated_data['owner'] = self.context['request'].user return super().create(validated_data)
通用逻辑适配(非Django场景)
如果你用的是其他框架或者自定义ACL系统,核心逻辑完全通用:
- 所有请求先做身份认证校验,未认证直接返回403
- 优先判断用户是否为超级管理员,是则直接放行所有操作
- 针对需要操作单个对象的请求,校验对象的
owner字段是否与当前登录用户一致 - 列表类请求必须过滤出当前用户所属的对象,避免数据泄露
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

