Отдельно проверяющее имя пользователя и пароль во время аутентификации Django

Моя проблема с операторами переключения - то, что в приложении реального мира существуют редко операторы переключения, которые существуют в изоляции.

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

В конечном счете, самый чистый рефакторинг всей системы в Стратегическую модель с Фабрикой, управляющей созданием стратегий на основе единственной остающейся копии оператора переключения.

из-за ограничений времени мы не взяли его немного дальше, потому что это удовлетворило наши потребности. Был все еще большой гигантский оператор переключения, но был только один, таким образом добавляя, что дополнительные стратегии только потребовали реализации интерфейса и добавления, что создание ступает в оператор главного выключателя.

5
задан Steg 16 October 2009 в 21:10
поделиться

4 ответа

Это не функция серверной части, а просто форма аутентификации. Просто перепишите форму, чтобы отображать нужные вам ошибки для каждого поля. Напишите представление входа, которое использует вашу новую форму, и сделайте его URL-адресом входа по умолчанию. (На самом деле я только что видел в недавнем коммите Django, что теперь вы можете передать настраиваемую форму в представление входа в систему, так что это еще проще выполнить). Это займет около 5 минут. Все, что вам нужно, находится в django.contrib.auth.

Чтобы уточнить, вот текущая форма:

class AuthenticationForm(forms.Form):
    """
    Base class for authenticating users. Extend this to get a form that accepts
    username/password logins.
    """
    username = forms.CharField(label=_("Username"), max_length=30)
    password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)

    def __init__(self, request=None, *args, **kwargs):
        """
        If request is passed in, the form will validate that cookies are
        enabled. Note that the request (a HttpRequest object) must have set a
        cookie with the key TEST_COOKIE_NAME and value TEST_COOKIE_VALUE before
        running this validation.
        """
        self.request = request
        self.user_cache = None
        super(AuthenticationForm, self).__init__(*args, **kwargs)

    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')

        if username and password:
            self.user_cache = authenticate(username=username, password=password)
            if self.user_cache is None:
                raise forms.ValidationError(_("Please enter a correct username and password. Note that both fields are case-sensitive."))
            elif not self.user_cache.is_active:
                raise forms.ValidationError(_("This account is inactive."))

        # TODO: determine whether this should move to its own method.
        if self.request:
            if not self.request.session.test_cookie_worked():
                raise forms.ValidationError(_("Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."))

        return self.cleaned_data

    def get_user_id(self):
        if self.user_cache:
            return self.user_cache.id
        return None

    def get_user(self):
        return self.user_cache

Добавьте:

def clean_username(self):
    username = self.cleaned_data['username']
    try:
        User.objects.get(username=username)
    except User.DoesNotExist:
        raise forms.ValidationError("The username you have entered does not exist.")
    return username
2
ответ дан 18 December 2019 в 07:10
поделиться

You really don't want to distinguish between these two cases. Otherwise, you are giving a potential hacker a clue as to whether or not a username is valid - a significant help towards gaining a fraudulent login.

20
ответ дан 18 December 2019 в 07:10
поделиться

Нам пришлось иметь дело с этим на сайте, который использовал службу подписки внешнего членства. В основном вы делаете

from django.contrib.auth.models import User

try:
    user = User.objects.get(username=whatever)
    # if you get here the username exists and you can do a normal authentication
except:
    pass # no such username

. В нашем случае, если имя пользователя не существует, нам нужно было проверить файл HTPASSWD, который был обновлен сценарием Perl с внешнего сайта. Если бы имя существовало в файле, мы бы создали пользователя, установили пароль и затем выполнили бы аутентификацию.

0
ответ дан 18 December 2019 в 07:10
поделиться

This answer is not specific to Django, but this is the pseudo-code I would use to accomplish this:

//Query if user exists who's username=<username> and password=<password>

//If true
    //successful login!

//If false
    //Query if user exists who's username=<username>
        //If true
            //This means the user typed in the wrong password
        //If false
            //This means the user typed in the wrong username
0
ответ дан 18 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: