feat: 添加脱敏Mixin docs。update README

This commit is contained in:
XIE7654
2025-09-01 10:34:10 +08:00
parent fddbd8b6a7
commit 6aaaf6c0c0
3 changed files with 503 additions and 0 deletions

View File

@@ -0,0 +1,167 @@
"""
脱敏功能使用示例
这个文件展示了如何在不同的序列化器中使用 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'
- 脱敏只影响显示,不影响数据库存储
- 超级用户和管理员默认可以查看完整值
- 可以通过重写方法来扩展功能
"""