Django Allauth-如何禁用社交帐户的重置密码?

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

我想社会用户只能登录没有密码。因此,我想禁用社交用户的/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 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"]