扫描二维码

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

发现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. 自定义的 Vue 3 Composition API 钩子,antd标签

    1. 创建自定义钩子 useDeviceStatus.js: import { computed } from 'vue'; export function useDeviceStatus(statu ...

  2. 物理机Jenkins接入K8s环境

    前言 本次记录物理机部署Jenkins,k8s弹性伸缩agent节点供部署项目. 安装 K8S 插件 登录 Jenkins,系统管理→ 插件管理 → 搜索 kubernetes,选择第二个 Kuber ...

  3. CoreOS 手动更新

    以阿里云 ECS 安装的 CoreOS 为例,你家装的 CoreOS 基本也一样啦. 查看和修改更新组 第一个问题:"什么是更新组?",请先看CoreOS 发行版本介绍 # 查看更 ...

  4. study PostgreSQL【1-PostgreSQL对象】

    1.服务 PostgreSQL是作为一种服务安装在操作系统下.多个PostgreSQL服务可以运行于同一台问你服务器上,但是他们侦听端口不能重复,也不能共享同一个数据存储目录. 2.Database ...

  5. 使用Python计算并可视化长直导线产生的磁场

    引言 大家好,今天我们来探讨一个有趣的话题--长直导线产生的磁场,并通过 Python 来进行计算和可视化.你可能会问,为什么要研究这个问题?其实,这是电磁学中的一个基础问题,理解了它,我们就能更好地 ...

  6. EvoSuite使用总结

    1.安装EvoSuite插件 以IDEA为例,在Plugins栏搜索EvoSuite后点击install,安装完成后重启IDEA 2.使用EvoSuite 选中文件右键选择Run EvoSuite 生 ...

  7. 测试工作中用到的Redis命令

    由于项目测试的需要,经常需要连接Redis数据库修改某些键值,无奈最近Redis的客户端连接工具使用不了 只有使用命令行来操作了,现总结如下: 1.远程连接Redis redis-cli -h hos ...

  8. MySQL 在设计表(建表)时需要注意什么?

    MySQL 在设计表(建表)时需要注意的要点 设计数据库表是 MySQL 开发中非常重要的一环.合理的表结构设计可以提升性能.减少存储开销,并提高维护性.以下是一些关键的注意事项: 1. 明确需求和数 ...

  9. Go 语言的数据类型转换有哪些?

    当不同的数据类型相互操作的时候,就需要类型转换,Go 的数据类型转换还是比较简单的. 数据类型转换包含显式和隐式两类,隐式的一般是大的数据类型到小的类型进行转换,不会有精度丢失的问题.否则就需要进行显 ...

  10. DDD之EFCore实现值对象

    参照: DDD之EFCore实现值对象 - peng_boke - 博客园 (cnblogs.com)