gpt4 book ai didi

django - 如何在由 "sites"框架提供支持的多个 Django 站点中获得唯一用户?

转载 作者:行者123 更新时间:2023-12-03 10:41:31 24 4
gpt4 key购买 nike

我正在构建一个 Django 站点框架,它将为多个独立站点提供支持,所有站点都使用相同的应用程序,但具有自己的模板。我计划通过使用多个设置文件并为它们设置唯一的 SITE_ID 来实现这一点,就像在 django.contrib.sites framework 的 Django 文档中所建议的那样。

但是,我不希望站点 A 的用户能够登录站点 B。在检查由 syncdb 创建的用户表后,我看不到任何可能将用户限制到特定站点的列。我还尝试在一个站点上创建一个用户“bob”,然后使用 shell 命令列出另一端的所有用户,果然,bob 出现在那里。

我怎样才能确保所有用户都被限制在他们各自的网站上?

最佳答案

最兼容的方法是创建一个 user Profile model包含 Site 模型的外键,然后写一个 custom auth backend根据该 FK 的值检查当前站点。一些示例代码:

定义您的个人资料模型,让我们在 app/models.py 中说:

from django.db import models
from django.contrib.sites.models import Site
from django.contrib.auth.models import User

class UserProfile(models.Model):
user = models.OneToOneField(User)
site = models.ForeignKey(Site)

编写您的自定义身份验证后端,继承自默认后端,让我们在 app/auth_backend.py 中说:
from django.contrib.auth.backends import ModelBackend
from django.contrib.sites.models import Site

class SiteBackend(ModelBackend):
def authenticate(self, **credentials):
user_or_none = super(SiteBackend, self).authenticate(**credentials)
if user_or_none and user_or_none.userprofile.site != Site.objects.get_current():
user_or_none = None
return user_or_none

def get_user(self, user_id):
try:
return User.objects.get(
pk=user_id, userprofile__site=Site.objects.get_current())
except User.DoesNotExist:
return None

这个身份验证后端假设所有用户都有一个配置文件;您需要确保您的用户创建/注册过程始终创建一个。

被覆盖的 authenticate方法确保用户只能登录正确的站点。 get_user根据用户 session 中存储的身份验证信息,在每个请求上调用方法从数据库中获取用户;我们的覆盖确保用户无法登录站点 A,然后使用相同的 session cookie 获得对站点 B 的未授权访问。(感谢 Jan Wrobel 指出需要处理后一种情况。)

关于django - 如何在由 "sites"框架提供支持的多个 Django 站点中获得唯一用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1404131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com