基于 SAML2 的 Django 自定义认证后端与属性映射
深入 SAML2 协议实现 SSO 单点登录,包括自定义属性映射、会话管理以及 Service Provider 元数据动态生成。 · 难度:入门 · +10XP
基于 SAML2 的 Django 自定义认证后端与属性映射
许多项目只使用 django-allauth 做社交登录,但企业级 SSO 需要 SAML2 协议。本课程从零编写一个自定义认证后端(继承 BaseBackend),解析 SAML Response 中的断言属性,映射到 Django User 模型的自定义字段。同时处理 NameID 持久化和 session 超时校验,并动态生成 SP 元数据 XML 供 IdP 配置。不使用任何第三方 SAML 库,只依赖 python3-saml 和 lxml。
from django.contrib.auth.backends import BaseBackend
from onelogin.saml2.auth import OneLogin_Saml2_Auth
class SAMLBackend(BaseBackend):
def authenticate(self, request, saml_response=None):
if not saml_response:
return None
auth = OneLogin_Saml2_Auth(request, custom_base_path)
auth.process_response(saml_response)
if auth.is_authenticated():
email = auth.get_attribute('email')[0]
user, _ = User.objects.get_or_create(email=email)
return user
return None