Flask - аутентификация хешированного пароля из SQLAlchemy - PullRequest
0 голосов
/ 01 мая 2018

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

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

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()

1 Ответ

0 голосов
/ 01 мая 2018

Запрос такой. 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.

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