欢迎访问宙启技术站
智能推送

使用Flask和SQLAlchemy实现用户认证和授权功能

发布时间:2024-01-14 10:20:37

Flask是一个轻量级的Web应用框架,而SQLAlchemy是一个Python库,用于简化与关系型数据库的交互。结合使用Flask和SQLAlchemy可以方便地实现用户认证和授权功能。

下面我们将通过一个例子来演示如何使用Flask和SQLAlchemy实现用户认证和授权功能。

首先,我们需要安装Flask和SQLAlchemy。

pip install flask
pip install flask_sqlalchemy

然后,我们创建一个Flask应用,并配置数据库连接。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

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

接下来,我们定义一个用于存储用户信息的表格。

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

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

然后,我们创建数据库并初始化一个管理员用户。

db.create_all()
admin = User('admin', 'password')
db.session.add(admin)
db.session.commit()

接着,我们定义用户认证的接口。

from flask import request, jsonify, make_response
from werkzeug.security import generate_password_hash, check_password_hash

@app.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    username = data['username']
    password = data['password']

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

    if not user:
        return jsonify({'message': 'User does not exist'}), 400

    if not check_password_hash(user.password, password):
        return jsonify({'message': 'Invalid password'}), 400

    # 生成令牌
    token = generate_token(user.id)

    return jsonify({'token': token})

def generate_token(user_id):
    # 生成令牌的逻辑
    pass

在上述代码中,我们首先获取请求中传递的用户名和密码,并通过User.query.filter_by(username=username).first()查询数据库中的用户信息。然后使用check_password_hash函数验证密码是否正确。如果验证通过,则生成一个令牌并返回给用户。

最后,我们定义一个需要授权才能访问的接口。

from functools import wraps

@app.route('/protected')
@auth_required
def protected():
    return jsonify({'message': 'Protected resource'})

def auth_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        token = request.headers.get('Authorization')

        if not token:
            return jsonify({'message': 'Token is missing'}), 401

        user_id = verify_token(token)

        if not user_id:
            return jsonify({'message': 'Invalid token'}), 401

        user = User.query.get(user_id)

        if not user:
            return jsonify({'message': 'User does not exist'}), 401

        return f(*args, **kwargs)

    return decorated

def verify_token(token):
    # 验证令牌的逻辑
    pass

在上述代码中,我们使用auth_required装饰器来限制对protected接口的访问,只有在请求头中携带有效的令牌时才能访问。在auth_required装饰器中,我们首先获取请求头中的令牌,然后验证令牌的有效性,最后返回响应结果。

当用户发送请求时,需要在请求头中添加Authorization字段,值为生成的令牌。

以上就是使用Flask和SQLAlchemy实现用户认证和授权功能的简单例子。通过结合使用Flask和SQLAlchemy,我们可以方便地实现用户认证和授权功能,并保护敏感资源不被未授权的用户访问。