Flask登录验证装饰器未正确生效,用户可访问他人页面问题排查
问题分析与修复
你的装饰器逻辑和原代码的核心差异在于没有正确获取路由中的目标用户名参数,导致验证逻辑完全偏离预期。
错误原因
原代码的验证逻辑是:
访问
/xxx时,检查当前会话是否包含xxx(表示登录用户就是xxx),或者会话标记为管理员,否则拒绝访问。
但你的装饰器犯了两个关键错误:
- 错误地从session中取
logged_in作为用户名,而非从路由参数中获取当前访问的目标用户名(也就是URL里的<username>) - 验证时用登录用户的标识去检查session,而不是用访问页面对应的目标用户名,导致任何登录用户都能绕过权限检查访问他人页面
修复后的装饰器
from functools import wraps from flask import session, redirect, url_for, abort def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): # 从路由参数中获取当前访问的目标用户名 target_username = kwargs.get("username") if not target_username: return redirect(url_for("login")) # 和原代码完全一致的验证逻辑 if not (session.get(target_username) or session.get("admin")): abort(401) return f(*args, **kwargs) return decorated_function
额外优化建议
如果你的session是用logged_in存储当前登录用户名(更常见的做法),可以把验证逻辑调整得更清晰:
def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): target_username = kwargs.get("username") current_user = session.get("logged_in") # 未登录则跳转登录页 if not current_user: return redirect(url_for("login")) # 非管理员且访问的不是自己的页面则拒绝 if not (current_user == target_username or session.get("admin")): abort(401) return f(*args, **kwargs) return decorated_function
内容的提问来源于stack exchange,提问作者Sim
相关产品推荐
相关产品推荐

