如何基于Flask-Login创建角色权限装饰器(无需Flask-Security/Principal)
基于Flask-Login实现自定义权限装饰器
2023年我在项目中找不到合适的权限管理方案——Flask-Security和Flask-Principal要么安全性存疑,要么针对Python的更新停滞,因此不想依赖这两个工具。目前我使用Flask-Login做用户认证,在管理页面路由里用硬编码判断权限:
if current_user.roles == 'admin': la = la return render_template("admin/admin_dashboard.html", la=la) else: return redirect(url_for('views.index'))
想把这段重复逻辑改成可复用的装饰器,避免每个路由都写相同代码。
实现自定义权限装饰器
可以通过functools.wraps封装一个通用的角色校验装饰器,替代硬编码判断:
- 导入所需模块
from functools import wraps from flask import redirect, url_for, abort from flask_login import current_user, login_required
- 定义装饰器函数
def role_required(required_role): def decorator(view_func): @wraps(view_func) def wrapped_view(*args, **kwargs): # 先校验用户是否已登录(也可以和@login_required配合使用) if not current_user.is_authenticated: return redirect(url_for('login')) # 替换为你的登录路由 # 校验用户角色是否符合要求 if current_user.roles != required_role: abort(403) # 返回403禁止访问,也可改成跳转到首页:return redirect(url_for('views.index')) return view_func(*args, **kwargs) return wrapped_view return decorator
- 在路由中使用装饰器
@app.route('/admin/dashboard') @login_required # 先确保用户已登录,Flask-Login自带的装饰器 @role_required('admin') def admin_dashboard(): la = la # 你的业务逻辑代码 return render_template("admin/admin_dashboard.html", la=la)
扩展说明
如果需要支持多角色访问(比如允许
admin和editor进入),可以修改装饰器的判断逻辑:def role_required(*required_roles): def decorator(view_func): @wraps(view_func) def wrapped_view(*args, **kwargs): if not current_user.is_authenticated: return redirect(url_for('login')) if current_user.roles not in required_roles: abort(403) return view_func(*args, **kwargs) return wrapped_view return decorator使用时:
@role_required('admin', 'editor')abort(403)会返回默认的403错误页面,你可以通过Flask的错误处理机制自定义这个页面,更贴合项目风格。
内容的提问来源于stack exchange,提问作者Vadim Popoff
相关产品推荐
相关产品推荐

