MST

星途 面试题库

面试题:Python中Flask实现用户认证的基本流程

在Python的Flask框架下,简述实现用户认证的基本步骤,包括但不限于使用何种扩展、涉及哪些关键代码片段,以及验证用户登录信息通常会采取的方式。
31.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

1. 使用的扩展

通常会使用 Flask - HTTPBasicAuthFlask - Login 扩展来实现用户认证。

  • Flask - HTTPBasicAuth:适用于简单的基于HTTP基本认证的场景。它会在每次请求时要求用户提供用户名和密码。
  • Flask - Login:更适合Web应用中复杂的用户会话管理,它支持记住用户登录状态等功能。

2. 关键代码片段(以Flask - HTTPBasicAuth为例)

  1. 安装扩展
pip install flask - httpbasicauth
  1. 初始化并配置认证
from flask import Flask
from flask_httpbasicauth import HTTPBasicAuth

app = Flask(__name__)
auth = HTTPBasicAuth()

users = {
    "admin": "password123"
}

@auth.verify_password
def verify_password(username, password):
    if username in users and users[username] == password:
        return True
    return False
  1. 保护路由
@app.route('/protected')
@auth.login_required
def protected():
    return "This is a protected route"

3. 验证用户登录信息的方式

  • 数据库验证:将用户的用户名和密码存储在数据库(如SQLite、MySQL、PostgreSQL等)中。在用户登录时,查询数据库,比对输入的用户名和密码与数据库中存储的信息是否匹配。例如使用SQLAlchemy库连接数据库并进行查询:
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///users.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)

@auth.verify_password
def verify_password(username, password):
    user = User.query.filter_by(username=username, password=password).first()
    if user:
        return True
    return False
  • 哈希密码验证:为了安全,不应该直接存储明文密码,而是存储密码的哈希值。使用如 bcrypt 库对密码进行哈希处理。在验证时,对用户输入的密码进行相同的哈希处理,然后比对哈希值。
import bcrypt

# 注册时对密码进行哈希
password = "user_password".encode('utf - 8')
hashed = bcrypt.hashpw(password, bcrypt.gensalt())

# 登录验证
@auth.verify_password
def verify_password(username, password):
    user = User.query.filter_by(username=username).first()
    if user:
        return bcrypt.checkpw(password.encode('utf - 8'), user.password)
    return False

4. 关键代码片段(以Flask - Login为例)

  1. 安装扩展
pip install flask - login
  1. 初始化并配置认证
from flask import Flask
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user

app = Flask(__name__)
app.secret_key = 'your_secret_key'

login_manager = LoginManager()
login_manager.init_app(app)

class User(UserMixin):
    pass

users = {'admin': {'password': 'password123'}}

@login_manager.user_loader
def load_user(user_id):
    if user_id in users:
        user = User()
        user.id = user_id
        return user
    return None
  1. 登录和保护路由
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        if username in users and users[username]['password'] == password:
            user = User()
            user.id = username
            login_user(user)
            return redirect(url_for('protected'))
        else:
            return 'Invalid credentials'
    return render_template('login.html')

@app.route('/protected')
@login_required
def protected():
    return "This is a protected route"

@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('login'))