Flask - аутентификация хешированного пароля от SQLAlchemy

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

Пароль правильно хешируется при регистрации. Когда я сохраняю хешированный пароль и пытаюсь его аутентифицировать, программа выдает ошибку:

AttributeError: type object 'User' has no attribute 'query'

Подскажите, пожалуйста, что не так? Я подозреваю, что функция проверки не может найти хешированный пароль из базы данных SQLAlchemy. Спасибо.

Когда я использую:

query = s.query(User).filter(User.username.in_([POST_USERNAME]))

Я получил:

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with User.password has an attribute 'split'

   engine = create_engine('sqlite:///tutorial.db', echo=True)

   app = Flask(__name__)
   app.config.from_object(__name__)
   app.config['SECRET_KEY'] = 'XXXXX'

   def hash_password(password):
        salt = uuid.uuid4().hex
        return hashlib.sha256(salt.encode() + password.encode()).hexdigest() + ':' + salt

    def check_password(hashed_password, user_password):
        password, salt = hashed_password.split(':')
        return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest()

   Base = declarative_base()
   class User(Base):

       __tablename__ = "users"

       id = Column(Integer, primary_key=True)
       username = Column(String(64))
       password = Column(String(120))
       email = Column(String(64))

       def __init__(self, username, password, email):
           self.username = username
           self.password = password
           self.email = email

       def check_password(hashed_password, user_password):
           password, salt = hashed_password.split(':')
           return password == hashlib.sha256(salt.encode() + user_password.encode()).hexdigest()

    Base.metadata.create_all(engine)

    @app.route("/")
     def index():
         return render_template('index.html')

    @app.route('/login', methods=['POST'])
     def do_admin_login():
       POST_USERNAME = str(request.form['username'])
       POST_PASSWORD = str(request.form['password'])

       Session = sessionmaker(bind=engine)
       s = Session()
       user = User.query.filter_by(username=POST_USERNAME).first()
       if check_password(User.password, POST_PASSWORD) == True:
            session['logged_in'] = True
       else:
           flash('wrong password!')
       return index()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
3 854
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Запрос вроде этого. s - это ваша сессия.

user = s.query(User).filter_by(username=POST_USERNAME).first()

Тогда ваш оператор if для проверки пароля неверен. Вы пытаетесь использовать класс модели вместо только что полученного экземпляра пользователя. Должно быть:

if check_password(user.password, POST_PASSWORD) == True:

также некоторые другие указатели: модуль Flask-SQLAlchemy помогает вам использовать SQLAlchemy во Flask (определяет ваш сеанс глобально). Также рассмотрите возможность использования bcrypt для паролей. Это НАМНОГО безопаснее, чем SHA.

Работаю, большое спасибо, я часами пытаюсь ее решить. Я посмотрю в bcrypt, это только для прототипа, а bcrypt выдавал ту же ошибку, так что теперь все должно быть хорошо.

user9665527 01.05.2018 20:20

Другие вопросы по теме