Flask用户登录及权限管理
代码仓库: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 "这是一个需要管理员权限才能访问的页面"