Django 1.3 отправляет сигналы входа / выхода в связи с аутентификацией - PullRequest
0 голосов
/ 14 октября 2011

Прежде всего оба метода возвращают True.Я ожидаю, что второй вернет False, используя стандартную процедуру аутентификации администратора django, или я ошибаюсь?

def post_login(sender, **kwargs):
    """
    Django 1.3 post login signal handler
    """
    # do stuff
    user = kwargs['user']
    print user.is_authenticated()

user_logged_in.connect(post_login)


def post_logout(sender, **kwargs):
    """
    Django 1.3 post logout signal handler
    """
    # do stuff
    user = kwargs['user']
    print user.is_authenticated()

user_logged_out.connect(post_logout)

В любом случае, я пытаюсь понять, почему у django также нет ловушки при сбое аутентификации.. Я могу использовать свой собственный бэкэнд для пользователей, чтобы войти и выйти из своей учетной записи, однако я хотел бы также подключиться к процедуре администратора, чтобы охватить все в одной части кода. Я нашел некоторые темы, но не знал, как это сделать.исправить это.

Я придумал:

import settings

from django.dispatch import Signal

failed_login = Signal(providing_args=['user'])

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class AuthSignalBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.get(username=username)
            if user.check_password(password):
                return user
            else:
                failed_login.send(sender=None, user=user)
        except User.DoesNotExist:
            return None


def login_handler(sender, **kwargs):
    if settings.DEBUG:
        print "failed login detected...!"
failed_login.connect(login_handler)

Это прекрасно работает, однако в ModelBackend нет запроса, в то время как у сигналов post_login и logout действительно есть запрос. Это прискорбнопотому что это было бы здорово для ведения журнала IP

Любой совет приветствуется, я уверен, что люди должны были встретить этот совет раньше ..

1 Ответ

4 голосов
/ 14 октября 2011
  1. Если user является экземпляром модели User, user.is_authenticated() будет всегда возвращать True.Экземпляр модели не может знать, что происходит на уровне запроса.Этот метод предназначен для представлений.

  2. Если вы хотите справиться с неудачными попытками входа в систему, взгляните на django-axes .Вы можете просто использовать его, или посмотреть на код и переопределить некоторые идеи, как вам нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...