如何无需登录暴露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
相关产品推荐
相关产品推荐

