django-allauth,我怎样才能只允许通过社交注册/登录?

问题描述 投票:0回答:4

我只想允许人们使用他们的社交帐户注册或登录。我已经进行了社交注册并登录,但我不知道如何禁用本地注册。

我已阅读文档,这听起来很接近我想要的

ACCOUNT_FORMS (={})
    Used to override forms, for example: {‘login’: ‘myapp.forms.LoginForm’}

我似乎可以制作一个新的注册表单,并且只包含社交登录链接,但我希望有任何我忽略的更简单的方法。我对这一切还很陌生,所以我仍然会错过很多显而易见的事情。

我还尝试将下面的代码更改为 False,但这也禁用了社交注册。

allauth.account.adapter.py

def is_open_for_signup(self, request):
    """
    Checks whether or not the site is open for signups.

    Next to simply returning True/False you can also intervene the
    regular flow by raising an ImmediateHttpResponse
    """
    return True
python django django-allauth
4个回答
9
投票

更改模板和 urlpatterns

您必须更改 allauth 默认提供的模板(loginsignup 等)和 urlpatterns,这与使用电子邮件的经典注册/登录流程相关。

  • 通过
    urlpatterns
    更改/减少可用路线可确保只有应有的路线可用。如果您操作正确,则任何尝试侵入现有 allauth 默认功能(与电子邮件相关)的行为都会显示 HTTP 错误 404。
  • 更改模板可以确保用户界面不提供与基于电子邮件的身份验证相关的内容。

没有简单的选择

不幸的是,截至目前,还没有简单的切换或设置来简单地禁用 django-allauth 的基于电子邮件的注册和身份验证。未来可能会在 GitHub 上提供更多详细信息,请参阅:

  • 问题#1227(“仅限社交:通过简单设置禁用所有本地帐户处理”)
  • 问题#345(“如何禁用表单登录/注册?”)

样品:
urls.py

像这样的

urls.py
将与 Django 1.10 上当前的 django-allauth (v0.30.0) 一起使用:

from django.conf.urls import include, url

from allauth.account.views import confirm_email, login, logout
from allauth.compat import importlib
from allauth.socialaccount import providers

providers_urlpatterns = []

for provider in providers.registry.get_list():
    prov_mod = importlib.import_module(provider.get_package() + '.urls')
    providers_urlpatterns += getattr(prov_mod, 'urlpatterns', [])

urlpatterns = [
    url(r'^auth/', include(providers_urlpatterns)),
    url(r'^confirm-email/(?P<key>[-:\w]+)/$', confirm_email, name='account_confirm_email'),
    url(r'^login/$', login, name='account_login'),
    url(r'^logout/$', logout, name='account_logout'),
    url(r'^signup/$', login, name='account_signup'),  # disable email signup
]

2
投票

解决方案并不是我最初想象的那样。更简单的方法是更改模板并删除该模板中的任何其他选项,而不是更改表单。

我的页面现在正确地仅显示社交身份验证,我很高兴。

如果有人有更好或更安全的答案,我会愿意接受。作为新的,我不知道这是否是最好的解决方案,但目前它看起来很棒并且将标记为已回答。


2
投票

好的,事情就是这样。如果您没有使用任何社交帐户链接到您的用户,那么完成您描述的任务非常简单,只需包含您需要的网址即可。但是,如果您需要使用社交帐户链接您的用户,那么您必须包含所有网址,因为大多数第三方应用程序不会验证您的应用程序的请求。他们只接受 allauth 的请求。

from django.urls import path, re_path
from allauth.account import views as accountviews

urlpatterns = [
                path('admin/', admin.site.urls),
                # remember to comment out the following line since it will
                # include all urls from allauth lib
                # path('accounts/', include('allauth.urls'))
]

# assume you only want singup page and login page from allauth
urlpatterns += [path("acc/signup/", accountviews.signup, name="account_signup"),
                path("acc/login/", accountviews.login, name="account_login")
]

0
投票

这是另一种分别控制本地和社交帐户注册的方法:

覆盖名为

account_adapters.py
的文件中的两个帐户适配器:

from allauth.account.adapter import DefaultAccountAdapter
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter


class NoNewUsersAccountAdapter(DefaultAccountAdapter):

    def is_open_for_signup(self, request):
        return False


class MySocialAccountAdapter(DefaultSocialAccountAdapter):

    def is_open_for_signup(self, request, **kwargs):
        return True

然后在您的设置中添加:

ACCOUNT_ADAPTER = 'myproject.account_adapter.NoNewUsersAccountAdapter'
SOCIALACCOUNT_ADAPTER = 'myproject.account_adapter.MySocialAccountAdapter'

您可能仍然想覆盖模板并只允许访问 Peterino 的答案中所述的部分 URL - 但如果您的用户群非常小且友好,那么设置这些适配器是一个务实的解决方案。


旁注:允许关闭 URL 的设置

SOCIALACCOUNT_ONLY
已在代码中但尚未发布(太新鲜)。

© www.soinside.com 2019 - 2024. All rights reserved.