2012年12月19日水曜日

Djangoで、メールアドレスとパスワードを利用したユーザ認証ログイン(修正)

Django(1.4.2)で、メールアドレスとパスワードを利用したユーザ認証ログインです。前回の記事は、ユーザ認証しただけで、ログインできていませんでした(笑)。今度こそ、ログインできたような気がします。カスタムの認証バックエンドを設定して、authenticate() を利用する必要があるようです。

1, settings.pyAUTHENTICATION_BACKENDSの設定を追加
2, settings.pyと同じ階層にbackends.pyを追加
3, views.pyで、authenticateを利用して認証

といった流れになります。ドキュメントにあるようにauthenticate() を最初に呼び出して、login() 認証させないと、ログイン出来ない模様。

settings.py(sampleprojectnameは、あなたのプロジェクト名)
AUTHENTICATION_BACKENDS = (
    'sampleprojectname.backends.EmailAuthBackEnd',
    'django.contrib.auth.backends.ModelBackend',
)
backends.py
from django.contrib.auth.backends import ModelBackend
from django.contrib.admin.models import User

class EmailAuthBackEnd(ModelBackend):
    def authenticate(self, email=None, password=None,**kwargs):
        try:
            user = User.objects.get(email=email)  
            if user.check_password(password):
                return user
            return None
        except User.DoesNotExist:
            return None
/member/views.py
from django.contrib.auth import authenticate, login, logout

email = form.cleaned_data['email']
password = form.cleaned_data['password']

user = authenticate(email=email, password=password)
if user is not None:
    if user.is_active:
        login(request, user)
        messages.info(request, 'いらっしゃいませー。')
        return HttpResponseRedirect('/') 
    else:
        messages.error(request, 'ログインに失敗しました。')
else:
    messages.error(request, 'ログインに失敗しました。')
実際に設定してみたサイトがこちら



参考サイト
Django Authentication With Email Instead of Usernames(Django foo)

0 件のコメント:

コメントを投稿