如何通过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
相关产品推荐
相关产品推荐

