You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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封装一个通用的角色校验装饰器,替代硬编码判断:

  1. 导入所需模块
from functools import wraps
from flask import redirect, url_for, abort
from flask_login import current_user, login_required
  1. 定义装饰器函数
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
  1. 在路由中使用装饰器
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:29:58