15

ユーザーが電子メールのみを使用してログインできるようにする認証バックエンドを作成したいと思います (ユーザー名もパスワードもありません)。

これが私が試したものです。

backends.py:

from django.conf import settings
from django.contrib.auth.models import User

class EmailAuthBackend(object):    
    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.get(email=username)
            if user:
                return user
        except User.DoesNotExist:
            return None 

settings.py:

  AUTHENTICATION_BACKENDS = (
       'path_to.backends.EmailAuthBackend',
       'django.contrib.auth.backends.ModelBackend',
      )

html:

   <form  method="post" action="{% url myproject.views.test %}">
    {% csrf_token %}

        <input type="text" name="email" value=""/>

    <button type="submit">Valider</button>

    </form>

見る:

 def test(request):
    email = ''
    if 'email' in request.POST:
        email = request.POST.get('email')
        if not User.objects.filter(email=email):
            User.objects.create(email=email)
        user = authenticate(username=email)
        if user is not None:
            if user.is_active:
                auth_login(request, user)
    return HttpResponseRedirect(reverse('home'))

機能しません。ユーザーは認証されていません。また、/admin に移動すると、次のエラーが発生します。

    AttributeError at /admin/logout/
    'EmailAuthBackend' object has no attribute 'get_user'
4

2 に答える 2

22

Django のカスタム バックエンドごとに、関数を指定する必要がありますget_userドキュメントを参照してください。実装は、次のget_userように、既存の User テーブルを単純に使用できます。

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

これが必要な理由は、別のソースから主キーを介してユーザーをフェッチする必要がある場合です。

于 2012-12-19T14:20:54.403 に答える
7

Bartekの答えは正しいものですが、継承して問題を解決する別の方法の例を提供します。ModelBackend

from django.contrib.auth.backends import ModelBackend

class EmailAuthBackend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(email=username)
            if user.check_password(password):
                return user
        except ObjectDoesNotExist:
            # Run the default password hasher once to reduce the timing
            # difference between an existing and a non-existing user (#20760).
            User().set_password(password)

get_userによってすでに実装されてModelBackendおり、それとともにパーミッション メソッドを取得します。

于 2014-11-10T20:32:59.057 に答える