Flask用户登录及权限管理
编程 python flask mysql 23

代码仓库:https://github.com/XuWink/flask-login.git

flask-login 是一个 Flask 扩展,用于在 Flask 应用中管理用户会话。它提供了用户登录、注销、记住用户会话等功能。下面是如何使用 flask-login 的基本步骤:

1、安装 Flask-Login

首先,需要安装 flask-login。可以通过 pip 安装:

pip install flask-login

2、基本用法

2.1 初始化 Flask-Login

首先,在你的 Flask 应用中初始化 flask-login

from flask import Flask
from flask_login import LoginManager

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 必须设置一个密钥
login_manager = LoginManager()
login_manager.init_app(app)

2.2 创建用户模型

你需要一个用户模型类来与 flask-login 交互。这个类需要实现几个方法:

from flask_login import UserMixin

class User(UserMixin):
    def __init__(self, id, username, password, role):
        self.id = id
        self.username = username
        self.password = password
        self.role = role

    def get_id(self):
        return str(self.id)

UserMixin 提供了默认的实现,简化了用户模型的创建。

3. 实现用户加载器

你需要实现一个用户加载器,用于从用户 ID 加载用户对象。@login_manager.user_loader 是 Flask-Login 中的一个装饰器,用于注册一个函数,该函数用于从用户 ID 加载用户对象。这个函数在用户会话中需要重新加载用户对象时被调用。

@login_manager.user_loader
def load_user(user_id):
    # 数据库查询逻辑
    connection = pymysql.connect(**db_config)
    try:
        with connection.cursor() as cursor:
            sql = "SELECT * FROM users WHERE id = %s"
            cursor.execute(sql, (user_id,))
            user_data = cursor.fetchone()
            if user_data:
                return User(user_data['id'], user_data['username'], user_data['password'], user_data['role'])
    finally:
        connection.close()
    return None

4. 登录和注销视图

创建登录和注销的视图函数。

  from flask import render_template, redirect, url_for, request
  from flask_login import login_user, logout_user, login_required

  @app.route('/login', methods=['GET', 'POST'])
  def login():
      if request.method == 'POST':
           username = request.form['username']
           password = request.form['password']

           # 数据库查询逻辑
          connection = pymysql.connect(**db_config)
          try:
              with connection.cursor() as cursor:
                  sql = "SELECT * FROM users WHERE username = %s"
                  cursor.execute(sql, (username,))
                  user_data = cursor.fetchone()
                  if user_data and user_data['password'] == password:  # 假设密码已经正确验证
                      user = User(user_data['id'], user_data['username'], user_data['password'], user_data['role'])
                      login_user(user, remember=False)
                      return redirect(url_for('protected'))
          finally:
              connection.close()
   
      return render_template('login.html')

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

5. 保护路由

使用 @login_required 装饰器来保护需要用户登录的路由。

   @app.route('/protected')
   @login_required
   def protected():
       return 'Logged in as: ' + str(current_user.username)

6. 记住用户

你可以让 flask-login 记住用户的会话,以便他们在关闭浏览器后仍然保持登录状态。

   login_user(user, remember=True)

3、添加权限认证

3.1 自定义权限认证装饰器

系统设置了两个绝了,role = 0代表admin,role=1代表user

from functools import wraps
from flask import abort
from flask_login import current_user

'''创建一个自定义装饰器来检查用户的权限'''
def role_required(role):
    def wrapper(fn):
        @wraps(fn)
        def decorated_view(*args, **kwargs):
            current_role = None
            if current_user.role == '0':
                current_role = 'admin'
            else:
                current_role = 'user'
            if not current_user.role == role:
                abort(403)  # 403 Forbidden
            return fn(*args, **kwargs)
        return decorated_view
    return wrapper

3.2 使用装饰器

在视图上添加装饰器,比如 /auth/1 需要admin权限才能访问,则添加 @role_required('admin')

@login_required
@role_required('admin')
@api.route('/auth/1', methods=['GET'])
def auth_index1():
    return "这是一个需要管理员权限才能访问的页面"

Flask用户登录及权限管理
http://47.92.222.121:8090/archives/RS04KgpJ
作者
禧语许
发布于
更新于
许可