Как сделать Flask -защиту логина по электронной почте или другим полем? - PullRequest
0 голосов
/ 02 марта 2020

Я сейчас использую Flask -Безопасность, чтобы создать страницу входа для моего сайта. Тем не менее, он может войти только по электронной почте. Я хочу, чтобы войти через электронную почту и номер мобильного телефона. Я следовал инструкциям из этого поста: flask -защищенный вход через имя пользователя, а не по электронной почте , но он не работает. Когда я ввожу номер мобильного телефона и пароль, я получу сообщение « Указанный пользователь не существует ». Вот код моей формы входа:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, HiddenField, BooleanField, PasswordField
from wtforms.validators import DataRequired, Length
from flask_security.forms import LoginForm

class MyLoginForm(LoginForm):
    email = StringField('Cellphone or Email', validators=[DataRequired(), Length(8, 60)])
    password = PasswordField('Passowrd', validators=[DataRequired(), Length(6, 128)])
    remember = BooleanField('Remember me')
    submit = SubmitField('Login')

А вот код для моих моделей:

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(60), nullable=False, unique=True)
    password = db.Column(db.String(128), nullable=False)
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role',
                        secondary=roles_users,
                        backref=db.backref('users', lazy='dynamic'))
    name = db.Column(db.String(50), nullable=False)
    cellphone = db.Column(db.String(15), nullable=False, unique=True)
    address = db.Column(db.String(150), nullable=False)

Я установил app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = ['cellphone', 'email'], а вот мой шаблон для login_user. html:

{% from "security/_macros.html" import render_field_with_errors, render_field %}
{%- extends "base.html" %}
{% include "security/_messages.html" %}

{% block title %}Login{% endblock %}
{% block contents %}
  <div class="container">
    <div class="row">
      <div class="col-md-4 col-md-offset-4 col-sm-10 col-sm-offset-1">
        <form action="{{ url_for_security('login') }}" method="POST" name="login_user_form">
          {{ login_user_form.hidden_tag() }}
          {{ render_field_with_errors(login_user_form.email, class_="form-control") }}
          {{ render_field_with_errors(login_user_form.password, class_="form-control") }}
          {{ render_field_with_errors(login_user_form.remember) }}
          {{ render_field(login_user_form.next) }}
          {{ render_field(login_user_form.submit, class_="btn btn-primary") }}
        </form>
      </div>
    </div>
  </div>
{% endblock %}

Интересно, что я должен сделать, чтобы Flask -Безопасность принимала либо мобильный телефон, либо электронную почту.

1 Ответ

0 голосов
/ 04 марта 2020

Один из возможных ответов заключается в том, что если вы используете Flask -Security 3.0 - он плохо обрабатывает различные входные данные - в частности, если он считает, что входные данные имеют номер c, он запрашивает PK, используя это значение, и не будет пытаться использовать другие USER_IDENTITY_ATTRIBUTES. Вы можете легко проверить это, установив в свой мобильный телефон несколько номеров (например, 555-1212). Обратите внимание, что начальный знак «+» все еще считается цифрой c по python. Тогда посмотрите, можете ли вы войти в систему с этим. Если это проблема - я улучшил это в моей поддерживаемой развилке по адресу: https://pypi.org/project/Flask-Security-Too/

...