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