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

如何为AAD/SSO流程创建的Django新用户自动分配默认用户组

问题根因

你的代码本身语法没有错误,信号也正常触发(因为CustomUserProfile可以成功创建),组分配未生效的核心原因是AAD SSO的登录流程在post_save信号执行完成后,存在额外的用户组覆盖逻辑:

  • 绝大多数Django AAD集成包(比如django-auth-adfs、django-microsoft-auth)默认启用了「AAD用户组同步」机制:每次用户登录完成后,会将用户的本地组和AAD侧分配的组做对齐,自动清除不在AAD同步列表内的本地组。你在post_save中添加的默认组,因为没有同步对应AAD侧的组ID,会被后续的同步逻辑直接删除,所以看不到分配结果也不会有报错。
  • 少数场景下如果你的项目开启了全局事务,SSO创建用户的全流程在同一个事务中,如果中间出现异常回滚,也会导致组分配操作被回滚,但你CustomUserProfile创建成功,所以该概率极低。

解决方案

你可以任选以下两种方案之一解决问题:

方案1:关闭SSO的自动组同步(适合不需要同步AAD侧组权限的场景)

找到你项目中AAD SSO的配置项,添加关闭组同步的配置,以django-auth-adfs为例配置如下:

AUTH_ADFS = {
    # 其他原有配置保持不变
    "GROUP_MAPPING": None,
    "SYNC_GROUPS": False,
}

如果使用其他SSO包,查找对应关闭组同步的参数设置即可。

方案2:使用SSO提供的登录完成信号触发组分配(适合需要保留AAD组同步的场景)

不要用User的post_save信号,改用SSO包提供的「用户登录完成」信号来执行组分配,确保你的操作在SSO的组同步逻辑完成之后执行,不会被覆盖。以django-auth-adfs为例,使用post_authenticate信号:

from auth_adfs.signals import post_authenticate

@receiver(post_authenticate)
def add_default_group(sender, user=None, **kwargs):
    # 只给没有任何组的新用户添加默认组
    if user and not user.groups.exists():
        default_group = Group.objects.get(name='Basis - Standard Access')
        user.groups.add(default_group)

如果是其他SSO包,查找对应登录完成的信号替换即可。

额外优化建议

你现有代码里CustomUserProfile.objects.create(user=instance).save()是冗余的,create()方法已经执行了save操作,不需要再调用一次save(),可以直接改为CustomUserProfile.objects.create(user=instance)。

内容的提问来源于stack exchange,提问作者Lord MooTao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:24:01