Django allauth,电子邮件作为用户名和多个站点



在多个站点上使用 Django allauth 时,是否可以将身份验证方法设置为"电子邮件"?

我的目标是允许电子邮件地址 bob@example.com 的用户在 site1.com 创建一个帐户,在 site2.com 创建一个单独的帐户。

为了使用电子邮件身份验证,我需要在设置中将UNIQUE_EMAIL设置为 True,但这会阻止已经在一个站点中拥有帐户的用户在另一个站点中创建帐户。

我假设你想允许在你的 Django 设置中的每个站点单独注册相同的电子邮件。

查看 allauth 代码;目前这样做似乎不可行,可能是因为 allauth 没有将站点 ID 作为用户注册过程的一部分。

class AppSettings(object):
class AuthenticationMethod:
USERNAME = 'username'
EMAIL = 'email'
USERNAME_EMAIL = 'username_email'
class EmailVerificationMethod:
# After signing up, keep the user account inactive until the email
# address is verified
MANDATORY = 'mandatory'
# Allow login with unverified e-mail (e-mail verification is
# still sent)
OPTIONAL = 'optional'
# Don't send e-mail verification mails during signup
NONE = 'none'
def __init__(self, prefix):
self.prefix = prefix
# If login is by email, email must be required
assert (not self.AUTHENTICATION_METHOD ==
self.AuthenticationMethod.EMAIL) or self.EMAIL_REQUIRED
# If login includes email, login must be unique
assert (self.AUTHENTICATION_METHOD ==
self.AuthenticationMethod.USERNAME) or self.UNIQUE_EMAIL

一种方法如下: - 保留 allauthAUTHENTICATION_METHOD作为用户名 - 将网站与用户信息一起存储,可能存储在用户配置文件中或通过覆盖用户模型。 - 使EmailSite的组合独一无二。 - 覆盖LoginView,以便用户输入电子邮件;您可以将EmailSite的组合转换为唯一用户帐户和用户名;您可以将其传递给Allauth以执行登录。

假设你使用 Sites 框架;你的代码看起来像这样:

from allauth.account.views import LoginView
from django.core.exceptions import ObjectDoesNotExist

class CustomLoginView(LoginView):
def get_user():
email = request.POST.get('email')
current_site = Site.objects.get_current()
try:
user = User.objects.get(email=email, site=current_site)
except ObjectDoesNotExist:
pass  # Handle Error: Perhaps redirect to signup 
return user

def dispatch(self, request, *args, **kwargs):
user = self.get_user()
request.POST = request.POST.copy()
request.POST['username'] = user.username
return super(CustomLoginView, self).dispatch(request, *args, **kwargs)

然后使用自定义登录视图对登录视图进行猴子修补:

allauth.account.views.LoginView = CustomLoginView

有关设置站点 FK 和自定义身份验证后端的相关阅读:

  • 如何在由"sites"框架驱动的多个 Django 站点上获取唯一用户?
  • https://docs.djangoproject.com/en/dev/topics/auth/#writing-an-authentication-backend

最新更新