You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swagger UI权限控制需求:未授权隐藏Try it out按钮,完成授权则显示

解决方案:控制Swagger UI中Try it out按钮的显示/隐藏

嘿,我刚好在项目里实现过这个需求,给你分享两个靠谱的方案,都是基于Swagger UI的自定义脚本就能搞定~

先说说核心逻辑

我们需要监听Swagger UI的授权状态变化,动态控制所有Try it out按钮的显示与隐藏:未授权或者没完成「Available authorizations」里的配置时隐藏按钮,等授权配置完成后再显示出来。


方案一:直接用事件监听+DOM操作(快速上手)

这个方案适合不想折腾源码,直接在Swagger UI的页面里加段脚本就能实现:

首先,在初始化Swagger UI的时候,绑定授权相关的事件,同时页面加载完成后先默认隐藏按钮:

// 初始化Swagger UI(替换成你的配置)
const ui = SwaggerUIBundle({
  url: "your-swagger-spec-url.json",
  dom_id: "#swagger-ui",
  // 其他你需要的配置,比如docExpansion、defaultModelRendering之类的
});

// 封装控制按钮显示的函数
function toggleTryItOutButtons(hasValidAuth) {
  // 找到所有Try it out按钮(如果是Swagger UI v2,选择器改成.btn.try-out)
  const tryItOutButtons = document.querySelectorAll('.try-out__btn');
  tryItOutButtons.forEach(btn => {
    btn.style.display = hasValidAuth ? 'inline-block' : 'none';
  });
}

// 页面刚加载时,默认没授权,先把按钮藏起来
document.addEventListener('DOMContentLoaded', () => {
  toggleTryItOutButtons(false);
});

// 监听授权状态变化事件,实时更新按钮显示
ui.addEventListener('authorize', (event) => {
  // 判断是否有生效的授权:这里检查所有授权方案是否有启用的
  // 如果你的场景只需要特定授权生效才显示,这里可以改成更精准的判断
  const hasValidAuth = Object.values(event.detail.authActions).some(action => action.enabled);
  toggleTryItOutButtons(hasValidAuth);
});

方案二:自定义Swagger UI插件(更优雅的长期方案)

如果你的项目需要更模块化的代码,或者后续还要扩展Swagger UI的功能,自定义插件会是更好的选择:

// 定义自定义插件
const HideTryItOutWithoutAuthPlugin = () => {
  return {
    statePlugins: {
      auth: {
        wrapSelectors: {
          // 包装授权状态的选择器,监听状态变化
          isAuthorized: (originalSelector) => (state) => {
            const isAuth = originalSelector(state);
            // 状态变化时更新按钮显示
            updateTryItOutButtons(isAuth);
            return isAuth;
          }
        }
      }
    }
  };
};

// 按钮控制逻辑和之前一致
function updateTryItOutButtons(isAuthorized) {
  const buttons = document.querySelectorAll('.try-out__btn');
  buttons.forEach(btn => {
    btn.style.display = isAuthorized ? 'inline-block' : 'none';
  });
}

// 初始化Swagger UI时引入这个插件
const ui = SwaggerUIBundle({
  url: "your-swagger-spec-url.json",
  dom_id: "#swagger-ui",
  plugins: [HideTryItOutWithoutAuthPlugin],
  // 其他配置...
});

// 初始加载后默认隐藏按钮
document.addEventListener('DOMContentLoaded', () => {
  updateTryItOutButtons(false);
});

一些注意事项

  • 授权有效性的判断逻辑:上面的代码是判断是否有任意一个授权方案启用,如果你的场景要求必须完成特定的授权(比如必须填API Key),可以修改hasValidAuth的判断逻辑,比如检查特定授权方案的状态。
  • Swagger UI版本兼容:如果是v2版本,DOM选择器需要改成.btn.try-out,事件监听的方式也可能略有不同,需要根据实际版本调整。

内容的提问来源于stack exchange,提问作者swap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:00:10