Django DRF 如何配置Swagger文档强制登录访问限制
DRF Swagger 文档访问权限配置方案
当前配置下文档完全公开的核心原因有两点:一是get_schema_view中public=True参数会跳过权限校验生成公开全量接口文档,二是permission_classes配置了permissions.AllowAny放通了所有匿名用户访问。按以下步骤修改即可实现权限管控:
1. 修改urls.py核心配置
调整schema_view的两个关键参数,替换权限校验规则:
# 引入你需要的权限类,这里以「仅登录管理员可访问」为例 from rest_framework.permissions import IsAuthenticated, IsAdminUser # 如需自定义权限(比如仅拥有特定权限码的用户可访问),可参考后面的自定义类写法 schema_view = get_schema_view( openapi.Info( title="API Docs", default_version='v1', description="beautiful and long text", license=openapi.License(name="BSD License"), ), public=False, # 改为False,文档不再公开,会根据访问用户的权限过滤可见接口 permission_classes=[IsAuthenticated, IsAdminUser], # 替换为你需要的权限类组合 )
自定义权限示例(比如仅持有
api_docs.access权限的用户可访问):from rest_framework.permissions import BasePermission class AllowDocsAccess(BasePermission): def has_permission(self, request, view): return request.user.is_authenticated and request.user.has_perm('api_docs.access')写完后把
permission_classes替换为[AllowDocsAccess]即可。
2. 适配认证方式(可选)
如果你的项目默认使用Session认证(比如对接Django Admin登录),现有配置已经可以正常工作:未登录用户访问文档地址时会自动跳转到登录页,登录后权限校验通过即可查看文档。
如果项目使用JWT/Token等Header认证方式,可调整settings.py中的Swagger配置适配:
SWAGGER_SETTINGS = { 'SHOW_REQUEST_HEADERS': True, 'SECURITY_DEFINITIONS': { 'Bearer': { 'type': 'apiKey', 'name': 'Authorization', 'in': 'header', } }, 'USE_SESSION_AUTH': False, # 不需要Session登录弹窗时设为False,用户可直接在Swagger页点Authorize填入Token 'JSON_EDITOR': True, 'SUPPORTED_SUBMIT_METHODS': [ 'get', 'post', 'put', 'delete', 'patch' ], # 如需自定义登录/退出跳转地址,可加以下配置 # 'LOGIN_URL': '/your-login-path/', # 'LOGOUT_URL': '/your-logout-path/', }
效果验证
配置重启服务后:
- 未登录、无权限用户访问
/swagger/、/redoc/地址时会直接返回403无权限,或跳转到登录页 - 有权限的用户可正常访问文档,且文档中仅展示当前用户有权限调用的接口,不会泄露无权限接口信息
内容的提问来源于stack exchange,提问作者paulogil2010
相关产品推荐
相关产品推荐

