扫描二维码

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

发现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. 【电脑】重装Win10之后无法唤醒和正常关机(Y9000P 2022)

    问题: Y9000P 2022 改Windows10后经常关机关不全(自带键盘灯亮,电源指示灯不灭),这还不是最重要的,它一会儿不用到时间自动休眠后还经常唤醒不了 解决: 两个问题,总结一下: 一.关 ...

  2. EntityFramework 6 分页模式

    在我的另一篇博客中提到了EntityFrameworkCore 分页问题, 中提到了EntityFrameworkCore在针对不同版本SQL Server数据库时如何指定分页模式,那么如何在Enti ...

  3. 剖析 Docker Swarm 操作对容器端口影响

    剖析 Docker Swarm 操作对容器端口影响 一.背景阐述 在使用 Docker Swarm 构建集群环境过程中,于 ts3 节点出现了原有的容器端口全部失效,手动重启后才恢复的情况.期间涉及 ...

  4. mybatis报错Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java

    原因 传入参数为List<String>不能用lists != '' 判断 解决 将lists != '' 的判断去掉或者改为lists .size>0 其他 如果是Integer类 ...

  5. 使用SymPy求解矩阵微分方程

    引言 在数学.物理.工程等领域,微分方程常常被用来描述系统的变化和动态过程.对于多变量系统或者多方程系统,矩阵微分方程是非常常见的,它可以用来描述如电路.控制系统.振动系统等复杂的动态行为.今天,我们 ...

  6. Spring框架中的单例bean是线程安全的吗?

    1.介绍两个概念 有状态的bean:对象中有实例变量(成员变量),可以保存数据,是非线程安全的 无状态的bean:对象中没有实例变量(成员变量),不能保存数据,可以在多线程环境下共享,是线程安全的 2 ...

  7. JAVA基础之多线程三期--线程安全问题

    一.线程安全问题就是指:多个线程并发访问同一个资源而发生安全性的问题, 线程安全问题都是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写 操作,一般来说,这个全局变量是 ...

  8. 【问题解决】centos7已经不维护了,如何继续使用yum源?

    背景 CentOS 7 已于2024年6月30日停止维护,在停止维护后我们之前配置的国内镜像源大多都是空目录了,即在线国内镜像源不可用,就像下边这样提示: [root@bogon yum.repos. ...

  9. Web前端入门第 40 问:CSS float 浮动布局应用场景

    CSS float 浮动属性最早用于文字环绕图片效果,就像传统报纸上的印刷排版一样. CSS2 的规范推动了浮动用于其他元素,float 便被大范围应用于布局,当年常说的 div + css 布局,f ...

  10. 题解:P10983 [蓝桥杯 2023 国 Python A] 跑步计划

    一眼看,什么 py,不是纯计算题吗? 需要知道的 2023 年是平年,有 365 天. 每个月分别有 31,28,31,30,31,30,31,31,30,31,30,31 天. 计算 一月,十月,十 ...