Добавление требования для входа пользователя Flask - PullRequest
0 голосов
/ 24 июня 2019

Я использую Flask-Security, которая в свою очередь использует Flask-Login. У меня есть сайт, который требует, чтобы пользователь подтвердил свой адрес электронной почты и впоследствии был одобрен администратором. Без обеих этих вещей я не хочу, чтобы пользователь мог использовать сайт.

Я включил SECURITY_CONFIRMABLE, и письмо с токеном подтверждения отправляется правильно. Я установил SECURITY_POST_CONFIRM_VIEW, и пользователь перенаправляется в правильное представление, как только он нажимает ссылку для подтверждения в электронном письме. Однако пользователь вошел в систему как часть процесса подтверждения . Я не хочу, чтобы пользователь имел доступ, пока он не будет одобрен администратором. (Интересно, что этой строки нет в ветви develop.)

Я могу придумать четыре способа обойти это, и ни один из них не особенно привлекателен:

  1. Разрешить пользователю входить в систему после подтверждения, но украшать каждое представление login_required функцией, которая проверяет разрешения пользователя и отправляет их на страницу ошибок, если они не разрешены. У меня уже есть 2 из них, и я бы предпочел не добавлять треть к каждому представлению. Кроме того, неправильно разрешать вход в систему, когда пользователь не может использовать сайт, пока он не одобрен.

  2. Выключите SECURITY_CONFIRMABLE и отправьте / подтвердите токен самостоятельно. Это потребует копирования большого количества кода, и вероятность ошибки выше, чем мне бы хотелось. И, возможно, есть ли другие способы входа пользователя, которые обойдут эту проверку? Скажите через поток сброса пароля? Или если будущий админ включит пароль без логина с токенами?

  3. Патч обезьяны Flask-Security login_user или Flask-Login login_user для проверки. Кажется довольно странным, и я не знаю, как убедиться, что мой патч установлен до того, как любой другой код подключится к исходной функции.

  4. Вставьте одну из этих библиотек и вставьте обратный вызов, который я могу реализовать в своем коде. Кувалда, встретить орех. Плюс проблемы с ремонтопригодностью. Если, возможно, мне не удалось получить пиар.

Я надеюсь, что есть другой ответ, который я пропускаю. Это не может быть настолько необычной установкой!

1 Ответ

0 голосов
/ 24 июня 2019

К счастью, решение оказалось НАМНОГО проще, чем я боялся.UserMixin обладает свойством is_active, к которому обращаются в самом начале login_user Flask-Login.Так что мой код выглядит просто так:

class User(UserMixin, Base):
    @property
    def is_active(self):
        return (super(UserMixin, self).is_active and not self.has_role('pending'))

Теперь ни один пользователь не может войти в систему с ролью «в ожидании».

...