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

如何无需登录暴露Flask App Builder的登录API及Swagger文档

解决方案

1. 自定义SecurityManager开放登录API与Swagger路径

Flask App Builder(FAB)的权限控制基于Flask-Security,默认会拦截未认证请求。需要自定义SecurityManager,将登录API和Swagger相关端点加入公开白名单:

from flask_appbuilder import AppBuilder, SecurityManager

class CustomSecurityManager(SecurityManager):
    def __init__(self, appbuilder):
        super().__init__(appbuilder)
        # 开放登录API端点
        self.public_endpoints.add('AuthView.post_login')
        # 开放Swagger页面与接口文档端点
        self.public_endpoints.add('SwaggerView.index')
        self.public_endpoints.add('SwaggerView.spec')

# 初始化AppBuilder时指定自定义SecurityManager
appbuilder = AppBuilder(app, db.session, security_manager_class=CustomSecurityManager)

2. 配置JWT认证(令牌访问模式)

若需通过Bearer令牌访问API,先在配置中启用JWT认证:

from flask_appbuilder.security.manager import AUTH_JWT

# 启用JWT认证
app.config['AUTH_TYPE'] = AUTH_JWT
app.config['JWT_SECRET_KEY'] = 'your-strong-secret-key'  # 替换为实际密钥
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = 3600  # 令牌有效期(秒)

配置完成后,调用POST /api/v1/login接口,传入username和password参数,即可获取access_token,后续请求需在请求头携带:

Authorization: Bearer <your-access-token>

3. 新增API时添加令牌验证

自定义API接口时,使用FAB提供的@has_access装饰器确保仅认证用户可访问:

from flask_appbuilder.api import BaseApi, expose
from flask_appbuilder.decorators import has_access

class CustomAPI(BaseApi):
    resource_name = 'custom'  # API路径前缀:/api/v1/custom

    @expose('/protected-data', methods=['GET'])
    @has_access
    def get_protected_data(self):
        return self.response(200, data="仅认证用户可见的数据")

# 将自定义API添加到FAB
appbuilder.add_api(CustomAPI)

4. 排查全局拦截规则

若仍存在权限拒绝问题,检查是否存在自定义的before_request全局拦截函数,需将登录和Swagger路径排除在外:

@app.before_request
def global_auth_check():
    # 排除无需认证的路径
    excluded_paths = [
        '/api/v1/login',
        '/swagger/v1',
        '/swagger/v1/swagger.json'
    ]
    if request.path not in excluded_paths and not current_user.is_authenticated:
        return jsonify(error="Unauthorized"), 401

验证效果

  • 未登录状态下访问http://localhost:5000/swagger/v1应能正常加载Swagger文档
  • 调用POST /api/v1/login应返回access_token而非权限拒绝
  • 携带令牌访问自定义API应能正常返回数据,未携带令牌则返回401

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:02:32