Swashbuckle.AspNetCore:如何在Swagger UI中隐藏请求后的密码明文?
解决Swagger UI请求后密码明文显示的问题
你已经通过ISchemaFilter给密码字段加上了"format": "password"实现输入掩码,但请求发送后密码明文出现在历史记录或响应里,可通过以下两种方式解决:
1. 自定义Swagger UI脚本拦截显示(推荐,直接处理前端展示)
在配置Swagger UI的时候,注入自定义JavaScript,把请求/响应里的密码字段替换为掩码文本:
app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); // 添加自定义脚本 options.InjectJavascript("/swagger-ui/custom-script.js"); });
然后在wwwroot/swagger-ui目录下创建custom-script.js,内容如下:
// 拦截请求历史的显示 const originalRequestRender = window.ui.RequestsView.prototype.renderRequest; window.ui.RequestsView.prototype.renderRequest = function(request) { const result = originalRequestRender.call(this, request); // 替换请求体里的password字段值 return result.replace(/"password":"([^"]+)"/g, '"password":"***"'); }; // 拦截响应内容的显示 const originalResponseRender = window.ui.Response.prototype.renderBody; window.ui.Response.prototype.renderBody = function(body) { if (typeof body === 'string') { // 替换响应里的password字段值 body = body.replace(/"password":"([^"]+)"/g, '"password":"***"'); } return originalResponseRender.call(this, body); };
这个脚本会直接修改Swagger UI的请求历史和响应展示,把所有密码字段的明文替换成***,不会影响实际的API请求/响应数据,只是前端显示层面的处理。
2. 通过IOperationFilter修改API文档(后端控制字段显示)
如果想从Swagger文档层面就隐藏密码字段的响应内容,可以实现IOperationFilter,把响应里的密码字段标记为不显示:
public class HidePasswordResponseFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 遍历所有响应模型 foreach (var response in operation.Responses.Values) { if (response.Content.TryGetValue("application/json", out var content)) { foreach (var schema in content.Schema.Properties) { // 匹配密码字段名(可根据你的模型调整字段名) if (schema.Key.Equals("password", StringComparison.OrdinalIgnoreCase)) { // 设置为只读隐藏,同时添加说明 schema.Value.ReadOnly = true; schema.Value.Description = "敏感字段已隐藏"; } } } } } }
然后在Swagger配置里注册这个过滤器:
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); // 注册你已有的密码输入掩码过滤器 c.SchemaFilter<PasswordSchemaFilter>(); // 注册响应密码隐藏过滤器 c.OperationFilter<HidePasswordResponseFilter>(); });
这种方式会让Swagger UI不展示响应里的密码字段,但如果是请求参数的历史记录,还是得配合第一种前端脚本处理。
注意事项
- 第一种方案是纯前端处理,不会影响实际的API数据传输,适合只是不想在Swagger UI里明文展示的场景;
- 第二种方案是从文档层面控制,适合需要在API文档里就隐藏敏感字段的场景;
- 如果你的密码字段名不是
password,要对应修改脚本和过滤器里的字段名匹配逻辑。
内容的提问来源于stack exchange,提问作者Overlord Zurg
相关产品推荐
相关产品推荐

