扫描二维码

关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序https://tools.cmdragon.cn/

一、Pydantic模型敏感字段标记

1.1 基础字段标记方法

通过Field函数的description参数声明敏感字段:

from pydantic import BaseModel, Field

class User(BaseModel):
username: str
password: str = Field(..., description="敏感字段-用户密码")
phone: str = Field(..., example="138****7890")

1.2 高级安全类型应用

使用SecretStr类型自动隐藏敏感数据:

from pydantic import SecretStr

class SafeUser(BaseModel):
api_key: SecretStr
db_password: SecretStr # 输出时将自动转为********
print(SafeUser(api_key="sk-1234", db_password="db@123").json())
# 输出:{"api_key": "**********", "db_password": "**********"}

1.3 模型配置示例

class SensitiveModel(BaseModel):
class Config:
json_encoders = {
SecretStr: lambda v: "*******" if v else None
}
exclude_fields = ['password']

流程图说明:

graph TD
A[用户请求] --> B[模型验证]
B --> C[敏感字段标记]
C --> D[数据持久化]

二、响应数据动态脱敏策略

2.1 响应模型过滤

class UserResponse(BaseModel):
username: str
email: str @app.get("/users/me", response_model=UserResponse)
async def read_user_me():
return current_user.dict()

2.2 动态字段排除

from fastapi import Depends

def mask_sensitive_data(user: User):
return user.dict(exclude={"password", "ssn"}) @app.get("/users/{id}")
async def get_user(data: dict = Depends(mask_sensitive_data)):
return data

2.3 条件脱敏实现

from typing import Optional

class DynamicResponse(BaseModel):
name: str
phone: Optional[str]
email: Optional[str] @classmethod
def create_with_mask(cls, user: User, is_admin: bool):
fields = user.dict()
if not is_admin:
fields.update({"phone": "138****7890", "email": "***@example.com"})
return cls(**fields)

流程图说明:

graph TD
A[原始数据] --> B{权限判断}
B -->|通过| C[字段替换]
B -->|拒绝| D[返回错误]
C --> E[响应输出]
D --> E

三、第三方加密服务集成(Vault)

3.1 Vault配置示例

import hvac

vault_client = hvac.Client(
url="http://vault:8200",
token="s.4zNq3Z8gKj9R6tY1"
) def encrypt_data(data: str) -> str:
return vault_client.secrets.transit.encrypt_data(
name="fastapi-key",
plaintext=data.encode()
)["data"]["ciphertext"]

3.2 集成到数据模型

from pydantic import validator

class EncryptedUser(User):
@validator('password', pre=True)
def encrypt_password(cls, v):
return encrypt_data(v)

3.3 完整工作流程

graph TD
A[客户端请求] --> B[参数验证]
B --> C{敏感字段判断}
C -->|是| D[Vault加密]
C -->|否| E[直接存储]
D --> F[数据库保存]
E --> F

课后Quiz

  1. 当需要在前端显示用户手机号时,应该使用哪种脱敏方式?

    A) 完全显示

    B) 中间四位星号

    C) 全部加密

    D) 随机替换

    答案:B

    答案解析:根据PCI DSS规范要求,敏感信息需要部分隐藏但保持可识别性

  2. 以下哪项是Vault的核心功能?

    A) 自动生成API文档

    B) 动态密钥管理

    C) 请求速率限制

    D) 数据库迁移

    答案:B

    答案解析:Vault提供加密即服务、密钥轮换等安全功能

常见报错解决方案

问题1:422 Validation Error

现象

{"detail":[{"loc":["body","password"],"msg":"field required","type":"value_error.missing"}]}

解决方法

  1. 检查请求体是否包含必填字段
  2. 验证字段类型是否符合模型定义
  3. 使用try-except块捕获ValidationError:
from fastapi import HTTPException
from pydantic import ValidationError @app.post("/users")
async def create_user(data: dict):
try:
return User(**data)
except ValidationError as e:
raise HTTPException(422, detail=e.errors())

问题2:Vault连接超时

现象hvac.exceptions.VaultDown: Unable to connect to Vault server

排查步骤

  1. 检查Vault服务状态:vault status
  2. 验证网络连通性:telnet vault 8200
  3. 更新客户端令牌:vault token renew

环境配置

pip install fastapi==0.68.0 pydantic==1.8.2 python-multipart==0.0.5 hvac==0.11.2

代码验证方法

import pytest
from fastapi.testclient import TestClient client = TestClient(app) def test_sensitive_masking():
response = client.get("/users/1")
assert "****" in response.json()["phone"]

以上内容通过实际案例演示了从字段标记到加密集成的完整数据脱敏流程,采用符合行业标准的安全实践,建议在生产环境中配合HTTPS和访问日志审计共同使用。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

,阅读完整的文章:如何在FastAPI中巧妙玩转数据脱敏,让敏感信息安全无忧?

往期文章归档:

免费好用的热门在线工具

如何在FastAPI中巧妙玩转数据脱敏,让敏感信息安全无忧?的更多相关文章

  1. 关于如何在mysql中插入一条数据后,返回这条数据的id

    简单的总结一下如何在mysql中出入一条数据后,返回该条数据的id ,假如之后代码需要这个id,这样做起来就变得非常方便,内容如下: <insert id="insertAndGetI ...

  2. 如何在 PHP 中处理 Protocol Buffers 数据

    Protocol Buffers是谷歌定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小,解析效率高 ...

  3. 如何在Vue中使用Mockjs模拟数据的增删查改

    之前一直使用json-server在前端开发时,搭建本地数据接口测试,但有时又需要将做好的项目放于 github page上做项目演示.在本地时,json server很好使用,但一旦放在github ...

  4. wex5 如何在js中给data添加数据

    var options = { defaultValues :[ {'xuetang' : xuetang,'time' : time} ] }; this.comp("xuetangDat ...

  5. 如何在MyEclipse中通过hibernate使用jtds驱动连接数据库,并向数据库添加数据的方法

    最近学习了下如何在MyEclipse中通过hibernate使用jtds驱动连接数据库,并向数据库添加数据的方法,虽然MyEclipse中自带了连接数据库的方法,我也尝试了下其他方法,如有不当之处请指 ...

  6. 如何在open xml excel 中存储自定义xml数据?

    如何在open xml excel 中存储自定义xml数据? 而且不能放在隐藏的cell单元格内,也不能放在隐藏的sheet内,要类似web网站的Application变量,但还不能是VBA和宏之类的 ...

  7. 160803、如何在ES6中管理类的私有数据

    如何在ES6中管理类的私有数据?本文为你介绍四种方法: 在类的构造函数作用域中处理私有数据成员 遵照命名约定(例如前置下划线)标记私有属性 将私有数据保存在WeakMap中 使用Symbol作为私有属 ...

  8. Electron-vue实战(三)— 如何在Vuex中管理Mock数据

    Electron-vue实战(三)— 如何在Vuex中管理Mock数据 作者:狐狸家的鱼 本文链接:Vuex管理Mock数据 GitHub:sueRimn 在vuex中管理mock数据 关于vuex的 ...

  9. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  10. 【转】我是如何在SQLServer中处理每天四亿三千万记录的

    原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...

随机推荐

  1. 操作系统educative版本-笔记1

    Qustions How can we summarize a Process? At any instant in time, we can summarize a process by takin ...

  2. 【uniapp】文本控件多余文字省略号代替

    多余文字使用省略号效果 代码 .l-dd-content{ width: 100%; color: #8b8b8b; display: -webkit-box; /** 对象作为伸缩盒子模型显示 ** ...

  3. 高格发票勾稽之BUG

    select (INVNO) AS INVCODE, SDATE ,* FROM STKSALE1 WHERE LEN(INVSCODE) > 0 AND INVSCODE = '3100000 ...

  4. MQTT消息传递过程中,序列化协议如何选择?文本序列化还是二进制序列化协议。

    字符串消息的序列化 在上一篇文章中,我们使用MQTTnet 框架,实现了一个MQTT服务器.MQTT发布者进程.MQTT订阅者进程.在消息传递过程中,我们将控制台的字符串直接传递.因为MQTT是应用层 ...

  5. mybatis——分页插件PageHelper的使用

    项目开发中涉及列表查询时,经常会需要对查询结果进行分页处理:常用的一个插件--PageHelper,是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,一致支持mysql. ...

  6. eolinker脚本代码[Javascript]:脚本(函数)之间传参案例

    场景描述: 有等级卡A.B,依次通过查询A.B,检查A.B下是否会会员,如果有,调整会员身份,没有着执行下一个循环 全部脚本:脚本中红色标注的user即脚本之间的传参 //以下代码为示例代码(支持原生 ...

  7. kettle介绍-Step之If field value is null

    If field value is null介绍 替换NULL值步骤可以将输入流中所有字段的空值进行替换,也可以指定一种类型下的空值进行替换,还可以指定一个字段下的空值进行替换 三种替换NULL模式 ...

  8. infiniswap用到的技术

    infiniswap来自 NSDI'17,其代码主要用到以下技术: configfs(主要) configfs-用户空间控制的内核对象配置 https://www.kernel.org/doc/Doc ...

  9. W.js ,一个超级小的三维 WebGL 引擎的使用方法

    目录 前言 它的特点 API 入门使用 内置模型 导入自己的模型 动画 自定义投影矩阵 摄像机与主角绑定 解除绑定 前言 我们知道,在网页上搞三维,three.js 和 babylon.js 都是成熟 ...

  10. MySQL高可用搭建方案之MHA

    MHA架构介绍 MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL ...