Files
django-vue3-admin-gd/backend/examples/desensitization.py
2025-09-01 10:34:10 +08:00

167 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
脱敏功能使用示例
这个文件展示了如何在不同的序列化器中使用 DesensitizationMixin 来实现字段脱敏
"""
from utils.serializers import CustomModelSerializer, DesensitizationMixin
# 示例1基本用法 - 脱敏单个字段
class BasicDesensitizationExample(DesensitizationMixin, CustomModelSerializer):
"""
基本脱敏示例
"""
# 指定需要脱敏的字段
desensitize_fields = ['password', 'api_key', 'secret_token']
class Meta:
model = None # 这里应该是您的模型
fields = '__all__'
# 示例2自定义脱敏格式
class CustomDesensitizationExample(DesensitizationMixin, CustomModelSerializer):
"""
自定义脱敏格式示例
"""
# 指定需要脱敏的字段
desensitize_fields = ['credit_card', 'phone_number', 'id_card']
# 自定义脱敏参数
desensitize_prefix_length = 2 # 保留前2位
desensitize_suffix_length = 2 # 保留后2位
desensitize_threshold = 6 # 长度小于等于6时全部脱敏
desensitize_char = '#' # 使用#作为脱敏字符
class Meta:
model = None
fields = '__all__'
# 示例3脱敏关联字段
class RelatedFieldDesensitizationExample(DesensitizationMixin, CustomModelSerializer):
"""
脱敏关联字段示例
"""
# 脱敏关联字段,使用点号分隔
desensitize_fields = [
'user.password', # 用户密码
'user.email', # 用户邮箱
'config.api_key', # 配置中的API密钥
'payment.credit_card', # 支付信息中的信用卡
'profile.phone_number' # 个人资料中的电话号码
]
class Meta:
model = None
fields = '__all__'
# 示例4混合脱敏和普通字段
class MixedDesensitizationExample(DesensitizationMixin, CustomModelSerializer):
"""
混合脱敏和普通字段示例
"""
from rest_framework import serializers
# 脱敏字段
desensitize_fields = ['secret_key', 'user.password']
# 普通字段
name = serializers.CharField()
description = serializers.CharField()
# 计算字段
full_name = serializers.SerializerMethodField()
def get_full_name(self, obj):
return f"{obj.first_name} {obj.last_name}"
class Meta:
model = None
fields = '__all__'
# 示例5条件脱敏
class ConditionalDesensitizationExample(DesensitizationMixin, CustomModelSerializer):
"""
条件脱敏示例
"""
desensitize_fields = ['api_key', 'secret_token']
def _can_view_full_value(self):
"""
重写权限检查方法,实现自定义权限逻辑
"""
request = self.context.get('request')
if not request or not request.user:
return False
# 检查特定权限
if request.user.has_perm('app.view_sensitive_data'):
return True
# 检查角色
if request.user.role.filter(name='数据管理员').exists():
return True
# 检查用户组
if request.user.groups.filter(name='高级用户').exists():
return True
# 默认只有超级用户和管理员可以查看
return request.user.is_superuser or request.user.is_staff
# 示例6不同字段使用不同脱敏规则
class MultiRuleDesensitizationExample(DesensitizationMixin, CustomModelSerializer):
"""
不同字段使用不同脱敏规则的示例
注意:这个示例需要自定义实现,因为 DesensitizationMixin 使用统一的规则
"""
desensitize_fields = ['api_key', 'phone_number', 'credit_card']
def _apply_desensitization(self, value):
"""
重写脱敏方法,为不同字段应用不同规则
"""
# 这里可以根据字段名或其他逻辑来应用不同的脱敏规则
# 由于 DesensitizationMixin 的设计,这个示例需要额外的自定义逻辑
return super()._apply_desensitization(value)
# 使用说明
"""
使用 DesensitizationMixin 的步骤:
1. 在序列化器中继承 DesensitizationMixin
class MySerializer(DesensitizationMixin, CustomModelSerializer):
pass
2. 设置需要脱敏的字段
desensitize_fields = ['field1', 'field2', 'related.field3']
3. 可选:自定义脱敏参数
desensitize_prefix_length = 3 # 保留前3位
desensitize_suffix_length = 3 # 保留后3位
desensitize_threshold = 10 # 长度小于等于10时全部脱敏
desensitize_char = 'X' # 使用X作为脱敏字符
4. 可选:重写权限检查方法
def _can_view_full_value(self):
# 自定义权限逻辑
pass
5. 可选:重写脱敏方法
def _apply_desensitization(self, value):
# 自定义脱敏规则
pass
注意事项:
- 脱敏字段会自动转换为 SerializerMethodField
- 关联字段使用点号分隔,如 'user.password'
- 脱敏只影响显示,不影响数据库存储
- 超级用户和管理员默认可以查看完整值
- 可以通过重写方法来扩展功能
"""