You need to enable JavaScript to run this app. 如何通过Flask login_required装饰器实现多角色登录权限管控
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Flask login_required装饰器实现多角色登录权限管控

Flask多角色权限管控调整方案

核心问题定位

  • 当前/addarticle路由完全没加权限校验,别说拦普通登录用户,未登录用户直接输网址都能进
  • 前端导航的“新增文章”入口是所有人都能看到的,没按登录后的身份做显示判断,普通用户自然能点进去

调整步骤

1. 新增管理员专属权限校验装饰器

现有登录逻辑里已经在识别到管理员时往session写了admin=True字段,普通用户登录不会写入这个值,直接拿这个做判断就行,不需要改动原有登录流程的代码,装饰器实现如下:

def admin_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        # 第一步校验是否已登录
        if "logged_in" not in session:
            flash("Bu Sayfayı Görüntülemek İçin Giriş Yapmalısınız", "danger")
            return redirect(url_for("login"))
        # 第二步校验是否为管理员身份
        if not session.get("admin", False):
            flash("Bu Sayfaya Erişim Yetkiniz Yok", "danger")
            return redirect(url_for("index"))
        return f(*args, **kwargs)
    return decorated_function

2. 给新增文章路由叠加权限校验装饰器

把原来无防护的addarticle路由调整为挂接双重校验的版本,确保只有已登录的管理员才能访问:

@app.route("/addarticle", methods=["GET", "POST"])
@login_required
@admin_required
def addarticle():
    return render_template("addarticle.html")

3. 前端模板实现入口的条件渲染

在导航栏对应“新增文章”的链接位置,增加会话判断逻辑,仅管理员登录后可见该入口:

<!-- 模板示例 -->
{% if session.get('admin') %}
<a href="{{ url_for('addarticle') }}">新增文章</a>
{% endif %}

调整后的拦截逻辑覆盖所有场景:

  • 未登录用户直接访问/addarticle路径时,会被login_required拦截并跳转登录页
  • 普通已登录用户直接访问/addarticle路径时,会被admin_required拦截并提示无权限,跳转回首页
  • 普通已登录用户视角下不会渲染出新增文章的入口,从交互层面消除误操作路径

开发注意事项

  • 现在的管理员判断是写死的账号匹配(username == "maxkonrad"),后面要加新管理员就得改登录代码,长期看最好在用户表里加个角色字段,登录时读数据库存到session里,扩展性好很多
  • 装饰器的顺序别搞反:通用的登录校验放下面,细分的管理员校验放上面,不然逻辑会出问题

内容的提问来源于stack exchange,提问作者maxkonrad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 16:57:04