当我使用名称和明文密码的用户登录的基本身份验证时,用户正确登录。
密码在注册期间正确散列。 当我存储散列密码并尝试对其进行身份验证时,程序会给出错误:
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 :(得分:0)
像这样查询。 s
是您的会话。
user = s.query(User).filter_by(username=POST_USERNAME).first()
然后你的if语句检查密码是错误的。您正在尝试使用模型类而不是您刚刚获得的用户实例。应该是:
if check_password(user.password, POST_PASSWORD) == True:
还有一些其他指针:模块Flask-SQLAlchemy
可以帮助您在Flask中使用SQLAlchemy(全局定义会话)。另请考虑使用bcrypt
作为密码。它比SHA更安全。