Django Allauth-如何禁用社交帐户的重置密码?
我想社会用户只能登录没有密码。因此,我想禁用社交用户的/accounts/password/reset/处的密码重置 我知道我需要在allauth.accounts.forms.py的代码中添加一个条件Django Allauth-如何禁用社交帐户的重置密码?,django,django-allauth,Django,Django Allauth,我想社会用户只能登录没有密码。因此,我想禁用社交用户的/accounts/password/reset/处的密码重置 我知道我需要在allauth.accounts.forms.py的代码中添加一个条件 class ResetPasswordForm(forms.Form): email=forms.EmailField( label=uu(“电子邮件”), 必需=真, widget=forms.TextInput(attrs={“type”:“email”,“size”:“30”})) def
class ResetPasswordForm(forms.Form):
email=forms.EmailField(
label=uu(“电子邮件”),
必需=真,
widget=forms.TextInput(attrs={“type”:“email”,“size”:“30”}))
def clean_电子邮件(自我):
电子邮件=自我清理的数据[“电子邮件”]
电子邮件=获取适配器()。清除电子邮件(电子邮件)
self.users=通过电子邮件过滤用户(电子邮件)
如果不是self.users.exists():
raise forms.ValidationError(\未分配电子邮件地址)
“任何用户帐户”))
返回自清理的_数据[“电子邮件”]
我正在考虑这个解决方案,但我不知道如何正确执行:
Allauth的可扩展性不是问题
self.users
包含提供电子邮件的所有用户,但如果您设置了ACCOUNT\u UNIQUE\u email=True
或只是没有更改它(默认情况下为True
),则您可以只使用第一个用户。每个用户都包含socialaccount\u set
相关管理者。因此,我们只需通过provider
name筛选设置,如果存在任何项目,则该用户具有相关的socialaccount。因此,您可以继承allauth表单并在其中添加附加检查:
# forms.py
class MyResetPasswordForm(ResetPasswordForm):
def clean_email(self):
email = self.cleaned_data["email"]
email = get_adapter().clean_email(email)
self.users = filter_users_by_email(email)
if not self.users.exists():
raise forms.ValidationError(_("The e-mail address is not assigned"
" to any user account"))
# custom code start
elif self.users.first().socialaccount_set.filter(provider='facebook').exists():
raise forms.ValidationError(_("You are using a social account.")
# custom code end
return self.cleaned_data["email"]
然后覆盖allauth设置以在重置密码视图中使用您的表单:
# your settings
ACCOUNT_FORMS = {
'reset_password': 'your_app.forms.MyResetPasswordForm'
}
我还没有测试过这段代码,所以它可以包含打字错误,所以请随时发布任何进一步的问题 答案有点不对劲,但现在Allauth返回一个列表,通过电子邮件过滤用户。
所以这对我有效
from allauth.account.forms import SignupForm, LoginForm, ResetPasswordForm
from allauth.account.adapter import get_adapter
from django.utils.translation import ugettext_lazy as _
from allauth.account.utils import filter_users_by_email
class MyResetPasswordForm(ResetPasswordForm):
def clean_email(self):
email = self.cleaned_data["email"]
email = get_adapter().clean_email(email)
self.users = filter_users_by_email(email)
if not self.users:
raise forms.ValidationError(_("Unfortunately no account with that"
" email was found"))
# custom code start
elif self.users[0].socialaccount_set.filter(provider='google').exists():
raise forms.ValidationError(_("Looks like the email/password combination was not used. Maybe try Social?"))
# custom code end
return self.cleaned_data["email"]
注意:如果您正在使用Facebook,我正在使用google社交身份验证,然后将其更改为Facebook。您的系统中是否有帐户\u UNIQUE\u EMAIL=True(默认为True)?嘿,它起作用了,现在社交用户无法重设密码。但你能帮我理解这一点吗?您选择第一个用户是什么意思?@这里我的意思是,如果您允许使用同一封电子邮件注册,
self.users
可以包含多个用户(定义为ACCOUNT\u UNIQUE\u email=False
)。但我认为您没有这样做,所以您的所有用户都有唯一的电子邮件,所以可以使用first()
方法仅从self.users
中选取第一个用户,然后只检查它。
from allauth.account.forms import SignupForm, LoginForm, ResetPasswordForm
from allauth.account.adapter import get_adapter
from django.utils.translation import ugettext_lazy as _
from allauth.account.utils import filter_users_by_email
class MyResetPasswordForm(ResetPasswordForm):
def clean_email(self):
email = self.cleaned_data["email"]
email = get_adapter().clean_email(email)
self.users = filter_users_by_email(email)
if not self.users:
raise forms.ValidationError(_("Unfortunately no account with that"
" email was found"))
# custom code start
elif self.users[0].socialaccount_set.filter(provider='google').exists():
raise forms.ValidationError(_("Looks like the email/password combination was not used. Maybe try Social?"))
# custom code end
return self.cleaned_data["email"]