0

私が遊んでいるカスタム認証バックエンドがあります。非アクティブなユーザーのログインを許可したい.が返されているsupports_inactive_userことを確認できても、フラグを true に設定してもうまくいかないようです。user

class AuthenticationBackend(ModelBackend):

    supports_object_permissions = False
    supports_anonymous_user = True
    supports_inactive_user = True

    def authenticate(self, username=None, password=None):
        """
        Allow login with email inplace of username

        """
        user = None
        if username is not None:
            username = username.strip()

        if email_re.search(username):
            try:
                user = User.objects.get(email__iexact=username)
            except User.DoesNotExist:
                pass

        if not user:
            try:
                user = User.objects.get(username__iexact=username)
            except User.DoesNotExist:
                return None

        if user.check_password(password):
            return user

    def get_user(self, user_id):

        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

私はジャンゴ1.4を使用しています。私は何が欠けていますか?

4

1 に答える 1

2

ユーザーは正常に認証されますが、ユーザーが非アクティブなときにAuthenticationForm発生するのは です。ValidationErrorサブクラスで clean メソッドをオーバーライドして、対応する をキャッチできますValidationError

class InactiveAuthenticationForm(AuthenticationForm):
    # a bit messy but it should work
    def clean(self):
        try:
            return super(InactiveAuthenticationForm, self).clean()
        except ValidationError as e:
            if self.cached_user is not None: # user exists but is not active
                # behavior that's skipped because of the validation error
                self.check_for_test_cookie()
                return self.cleaned_data
            else:
                raise e

ただし、ユーザーのis_activeフラグは、実際にユーザーを削除する代わりのものであると考えてください。の使用を再考することをお勧めしますis_active。ユーザーがアカウントを作成したらすぐにログインできるようにしたい場合は、それを実現するためのより良い方法があります。

于 2013-08-13T12:41:22.027 に答える