java - Springdoc 将安全性指定为打开
问题描述
我正在使用 Springdoc ( 1.4.8
) 来记录我们的 Rest API。99% 的调用都是使用 OAuth2 Bearer Token 保护的,所以我想默认添加它,如下所示:
new OpenAPI()
.components(new Components()
.addSecuritySchemes("bearerTokenScheme",
new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.name("bearerTokenScheme")
.scheme("Bearer")
.bearerFormat("JWT")
)
)
.addSecurityItem(new SecurityRequirement()
.addList("bearerTokenScheme")
)
默认情况下指定它很好,但我现在的问题是,我可以通过指定一个不安全的调用来以某种方式否决它吗?
我确实意识到默认情况下省略.addSecurityItem()
会将调用显示为不安全,但我希望默认情况下它们是安全的,并且只有在不安全时才需要覆盖它。
解决方案
我有一个类似的问题,我已经使用插件解决了它。该插件覆盖security
标记控制器或方法的值并将其设置为空列表。所以标记的端点仍然是不安全的。
@Component
public class NoSecurityPlugin implements OpenApiCustomiser {
private static final List<Function<PathItem, Operation>> OPERATION_GETTERS = Arrays.asList(
PathItem::getGet, PathItem::getPost, PathItem::getPut, PathItem::getDelete,
PathItem::getHead, PathItem::getOptions, PathItem::getPatch);
private static final List<String> tagsForNoSecurity = List.of(
"public", "unsecured"
);
@Override
public void customise(OpenAPI openApi) {
openApi.getPaths().forEach((path, item) -> getOperations(item).forEach(api -> {
List<String> tags = api.getTags();
if(tags != null && tags.stream().anyMatch(tagsForNoSecurity::contains)) {
api.setSecurity(Collections.emptyList());
}
}));
}
private static Stream<Operation> getOperations(PathItem pathItem) {
return OPERATION_GETTERS.stream()
.map(g -> g.apply(pathItem))
.filter(Objects::nonNull);
}
}
标记您的 API 方法(或Controller
):
@Tag(name = "public", description = "Public APIs")
推荐阅读
- python - 如何在python中使用groupby() 2列
- javascript - 页面加载时默认设置焦点按钮
- python - Python 使用正则表达式标记收缩
- azure-ad-b2c-custom-policy - 我们可以为应用程序设置两组 Azure B2C 登录自定义策略吗?
- sql - 无法将节点 js 连接到 SQL 服务器
- javascript - onblur 功能在 google chrome 和 firefox 中不起作用
- sql - 如何将 xml 或 txt 文件从 SQL Server 传递到 SAP PI
- r - R,pivot_wider 问题
- windows - 如何在 Windows 中使用 cmd/powershell 卸载受密码保护的应用程序
- r - 如何用不同的单位进行计算