# -*- coding: utf-8 -*-
|
"""
|
@File : permissions.py
|
@Time : 2023/8/23 14:46
|
@Author : geekbing
|
@LastEditTime : -
|
@LastEditors : -
|
@Description : 自定义权限类
|
"""
|
from rest_framework import permissions
|
from rest_framework.permissions import BasePermission, IsAdminUser
|
from lunarlink import models
|
|
|
# class HasProjectAccess(BasePermission):
|
# def has_object_permission(self, request, view, obj):
|
# # 检查请求的对象是否属于用户的组
|
# return obj.groups.filter(id__in=request.user.groups.all()).exists()
|
|
|
class HasProjectAccess(BasePermission):
|
message = "您没有执行此操作的权限"
|
|
def has_permission(self, request, view):
|
# 如果用户是超级管理员,允许访问所有项目
|
if request.user.is_superuser:
|
return True
|
|
# 获取当前用户所在的所有分组
|
user_groups = request.user.groups.all()
|
|
# 获取请求参数中的项目ID
|
project_id = view.kwargs.get("pk") or request.query_params.get("project")
|
|
# 如果项目ID存在,检查项目是否属于用户的分组
|
if project_id:
|
return models.Project.objects.filter(
|
pk=project_id, groups__in=user_groups
|
).exists()
|
|
# 如果没有项目ID且视图方法是 'list' 或 'create',则不需要进一步检查,因为 get_queryset 已经做了筛选
|
if view.action in ["list", "add"]:
|
return True
|
|
# 对于其他方法,可能需要检查对象级的权限
|
return False
|
|
|
class IsCreatorOrReadOnly(BasePermission):
|
"""
|
自定义权限,确保只有对象的创建者才可以修改或删除对象。
|
"""
|
|
def has_object_permission(self, request, view, obj):
|
# 对于GET、HEAD或OPTIONS请求,任何请求都允许读取权限,因此我们始终允许这些请求。
|
if request.method in permissions.SAFE_METHODS:
|
return True
|
|
# 判断请求的用户是否是对象的创建者。
|
return obj.creator == request.user
|
|
|
class CustomIsAdminUser(IsAdminUser):
|
message = "您没有执行此操作的权限"
|
|
def has_permission(self, request, view):
|
return request.user.is_superuser
|