Python 简单的登录示例-这是正确的方法吗?

Python 简单的登录示例-这是正确的方法吗?,python,flask,flask-login,Python,Flask,Flask Login,下面我尝试创建一个非常简化且简单的flask\u登录实现。当它工作时,我只想确保我用正确的方式来做。特别是,我的密码验证方法正确吗?我的意思是,我应该使用另一个flask_登录函数来为我执行此检查吗?我这里有没有不必要的代码 python和flask还是新手,如有任何建议/编辑,将不胜感激 用户名/密码检查: if (username, password) in users_db.items(): login_user(User(username))

下面我尝试创建一个非常简化且简单的
flask\u登录实现。当它工作时,我只想确保我用正确的方式来做。特别是,我的密码验证方法正确吗?我的意思是,我应该使用另一个flask_登录函数来为我执行此检查吗?我这里有没有不必要的代码

python和flask还是新手,如有任何建议/编辑,将不胜感激

用户名/密码检查:

 if (username, password) in users_db.items():
            login_user(User(username))
            return redirect(request.args.get("next"))
        else:
            return abort(401)
    else:
        return Response('''
        <form action="" method="post">
            <p><input type=text name=username>
            <p><input type=password name=password>
            <p><input type=submit value=Login>
        </form>
        '''
if(用户名、密码)在users\u db.items()中:
登录\用户(用户(用户名))
返回重定向(request.args.get(“下一步”))
其他:
返回中止(401)
其他:
返回响应(“”)



'''
整个登录尝试:

from flask import Flask, jsonify, render_template, request, url_for, redirect, session, abort, Response
from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user 


from flask_wtf import Form
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired


#################### Instantiate APP ###################################

'''Application Factory'''
app = Flask(__name__)

app.config['SECRET_KEY'] = 'shhsecret'   #make this more random and secret, i recommend using os.urandom(50) 
#################### Authentication ####################################

# flask-login
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"


class LoginForm(Form):
    username = StringField('Your username', validators=[DataRequired()])
    password = PasswordField('Your password', validators=[DataRequired()])
    submit = SubmitField('Sign In')


# silly user model
class User(UserMixin):

    def __init__(self, username):

        self.id = username
        self.password = users_db[username]
        
    def __repr__(self):
        return "%s/%s" % ( self.id, self.password)
    
    def is_active(self):
        return True

#users database (used dictionary just as an example) 
users_db = { 'bill':'password1'
            ,'jondoe': 'password2'
            ,'elonmusk' : 'passwordtesla'

}

# create users from our users database above     
users_activated = {User(key) for (key,value) in users_db.items()} 



  

# some protected url
@app.route('/protectedurl')
@login_required
def protectedurl_func():
    return Response("Hello World!")

 

# somewhere to login
@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']        
        if (username, password) in users_db.items():
            login_user(User(username))
            return redirect(request.args.get("next"))
        else:
            return abort(401)
    else:
        return Response('''
        <form action="" method="post">
            <p><input type=text name=username>
            <p><input type=password name=password>
            <p><input type=submit value=Login>
        </form>
        ''')


# somewhere to logout
@app.route("/logout")
@login_required
def logout():
    logout_user()
    return Response('<p>Logged out</p>')


# handle login failed
@app.errorhandler(401)
def page_not_found(e):
    return Response('<p>Login failed</p>')


# callback to reload the user object        
@login_manager.user_loader
def load_user(userid):
    return User(userid)



if __name__ == '__main__':
    app.run(debug=True, use_reloader=True)






从flask导入flask、jsonify、呈现模板、请求、url、重定向、会话、中止、响应
从flask_login导入LoginManager、UserMixin、login_required、login_user、logout_user
来自WASKU wtf进口表格
从wtforms导入StringField、PasswordField、SubmitField
需要从wtforms.validators导入数据
####################实例化应用程序###################################
“应用程序工厂”
app=烧瓶(名称)
app.config['SECRET_KEY']='shhsecret'#让它更加随机和保密,我建议使用os.Uradom(50)
####################认证####################################
#烧瓶登录
login\u manager=LoginManager()
登录管理器。初始化应用程序(应用程序)
login\u manager.login\u view=“login”
类登录信息(表格):
username=StringField('您的用户名',验证器=[DataRequired()]))
password=PasswordField('您的密码',验证器=[DataRequired()]))
submit=SubmitField('登录')
#愚蠢的用户模型
类用户(UserMixin):
定义初始化(self,用户名):
self.id=用户名
self.password=用户\数据库[用户名]
定义报告(自我):
返回“%s/%s”%(self.id,self.password)
def处于活动状态(自):
返回真值
#用户数据库(以字典为例)
用户_db={'bill':'password1'
,'jondoe':'password2'
,'elonmusk':'passwordtesla'
}
#从上面的用户数据库创建用户
users_activated={users_db.items()中(key,value)的用户(key)}
#一些受保护的url
@app.route(“/protectedurl”)
@需要登录
def protectedurl_func():
返回响应(“你好,世界!”)
#登录的地方
@app.route(“/login”,methods=[“GET”,“POST”])
def login():
如果request.method==“POST”:
用户名=请求。表单['username']
密码=请求。表单['password']
如果用户\ db.items()中的(用户名、密码):
登录\用户(用户(用户名))
返回重定向(request.args.get(“下一步”))
其他:
返回中止(401)
其他:
返回响应(“”)



''')
#要注销的地方
@应用程序路径(“/注销”)
@需要登录
def注销():
注销用户()
返回响应(“注销”

”) #句柄登录失败 @app.errorhandler(401) 未找到def页面(e): 返回响应(“登录失败

”) #回调以重新加载用户对象 @登录\u manager.user\u加载程序 def load_用户(用户ID): 返回用户(userid) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 运行(debug=True,use_reloader=True)
> p>所有工作。但是,在处理用户数据时,有一些原则需要考虑:

  • 密码决不能像用户给定的那样存储在数据库中
  • 对于代码重用性,考虑关注点的分离。
通常用于进行密码散列。当密码被“散列”时,意味着它已被转换为自身的加扰表示

这是它在python shell中的工作方式:

>>>来自werkzeug.security import生成\u密码\u散列
>>>hash=generate_password_hash('my_password'))
>>>散列
'pbkdf2:sha256:150000$aRIbsDyl$90ae44b1a5c679e08685c75ff0750df7c6670582a5839072d35a713316816760'
>>>
my_password
已通过一系列没有已知反向操作的加密操作转换为长编码字符串,这意味着获得哈希密码的人将无法使用它来获取原始密码

要验证用户密码,您可以执行以下操作:

>>>来自werkzeug.security import check\u password\u hash
>>>检查\u密码\u散列(散列“我的\u密码”)
真的
>>>检查\u密码\u散列(散列“另一个\u密码”)
假的
>>>
此密码散列是您应该存储在数据库中的内容:

从应用程序导入数据库
类用户(db.Model):
id=db.Column(db.Integer,主键=True)
username=db.Column(db.String(64),index=True,unique=True)
密码\u hash=db.Column(db.String(128))
def设置_密码(自我、密码):
self.password\u hash=生成密码\u hash(密码)
def检查_密码(自我、密码):
返回检查\u密码\u散列(self.password\u散列,password)
现在,您可以在路由中创建登录逻辑:

@app.route('/login',methods=['GET','POST'])
def login():
form=LoginForm()
if form.validate_on_submit():
user=user.query.filter\u by(username=form.username.data).first()
如果用户为None或not user。请检查\u密码(form.password.data):
flash('无效的用户名或密码')
返回重定向(url_用于('login'))
login\u user(user,memory=form.memory\u me.data)
返回重定向(url_for('index'))
返回呈现模板('login.html',title='Sign-In',form=form)
验证检查基本上是试图找出数据库中是否已经存在该用户。如果用户已经存在,并且其用户名和密码正确,则他们已登录。否则,他们将被重定向以再次尝试登录。