SSO场景下Django是否必须存储User?无本地用户如何实现API鉴权
问题1:使用LDAP/AD这类集中式身份管理系统时,Django存储Users是否是官方强推荐甚至强制要求的设计?
不是强制要求,官方的推荐仅针对**需要使用Django原生组件(Admin后台、内置权限系统、auth模块相关能力)**的场景。如果你的服务完全不需要依赖这些原生能力,完全可以不用在本地存储用户数据,Django本身没有强制要求必须存在User实例才能处理请求。
问题2:不想存储任何User相关信息,用装饰器实现校验放行是否是行业常见方案?
是非常常见的实现方式,尤其适合仅需要做Token校验放行、不需要关联用户业务数据、不需要使用Django原生权限体系的纯API服务场景。
不过有比装饰器更贴合DRF生态的实现方式:自定义继承BaseAuthentication的认证类时,不需要返回数据库中存在的User实例,你可以构造一个轻量的内存用户对象,只要设置is_authenticated=True、携带你需要的JWT声明字段即可,既符合DRF的认证规范,也不需要在本地存储用户数据,示例代码如下:
from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationFailed class AzureADJWTAuthentication(BaseAuthentication): def authenticate(self, request): # 此处为你的JWT校验逻辑,校验签名、受众、有效期等 payload = your_jwt_validate_logic(request) if not payload: raise AuthenticationFailed("Token校验失败") # 构造临时用户对象,无需写入数据库 class TempUser: is_authenticated = True def __init__(self, jwt_payload): self.username = jwt_payload.get("preferred_username") self.ad_user_id = jwt_payload.get("oid") return (TempUser(payload), None)
把这个认证类配置到视图或者全局DRF配置中,就可以用标准的DRF认证流程实现你的需求,比装饰器适配性更强,后续要加权限校验等逻辑也更方便。
问题3:强推荐同步用户数据的场景下,冗余存储用户库有什么优势?
冗余存储用户数据主要有以下几个实际收益:
- 可以直接复用Django原生的Admin后台、权限组、角色校验等能力,不需要自己从零实现权限逻辑,开发成本低
- 业务数据可以直接通过外键关联User表,相比存储字符串类型的外部用户ID,查询、统计、关联分析的效率和便利性都高很多
- 当外部身份提供商(比如Azure AD)出现故障、接口限流时,本地存储的用户基础信息可以保证业务的基础功能不受影响
- 可以灵活扩展用户的业务属性,不需要修改外部IDP的配置
问题4:同步的用户继承自django.contrib.auth.models.User,是否需要设置密码?
不需要设置有效密码,因为这类用户的认证完全由外部IDP完成,不会用到Django本地的密码校验逻辑。你可以调用Django内置的set_unusable_password()方法为这些用户设置一个不可用于登录的密码值,完全满足使用要求。
内容的提问来源于stack exchange,提问作者Jayjay Jay
相关产品推荐
相关产品推荐

