分类发布权限验证失效求助:未登录用户仍可发布分类
问题分析与修复方案
你的权限控制失效核心原因是验证逻辑完全偏离了“判断用户是否已登录”的需求,当前代码是在验证账号密码的正确性,而非用户的登录状态,导致无论是否登录,只要能提供正确的邮箱密码就能创建分类,甚至已登录用户没传密码会被拒绝。
问题点拆解
- 登录态管理缺失:没有使用session、JWT这类标准方式跟踪用户登录状态,而是每次创建分类都要求传入邮箱和密码,这既不安全,也完全不符合“已登录用户才能操作”的逻辑。
- 验证逻辑错误:调用
User.login(email2, req.body.password)是在验证“这个邮箱和密码是否匹配用户数据”,而不是验证“当前请求的用户已经完成登录流程”。
修复步骤
1. 先实现正确的登录态管理(以express-session为例)
首先安装并配置session中间件,用来跟踪用户登录状态:
const session = require('express-session'); // 在你的express app配置中添加 app.use(session({ secret: 'your-custom-secret-key', // 替换为自己的安全密钥 resave: false, saveUninitialized: false, cookie: { secure: false, // 生产环境请设为true,配合HTTPS使用 maxAge: 24 * 60 * 60 * 1000 // 设置session有效期为1天 } }));
然后编写登录接口,验证账号密码后将用户信息存入session:
// 用户登录接口 app.post('/login', (req, res) => { const { email, password } = req.body; const matchedUser = User.data.find(user => user.email === email && user.password === password); if (matchedUser) { req.session.user = matchedUser; // 标记用户已登录 return res.status(200).send('登录成功'); } else { return res.status(401).send('账号或密码错误'); } });
2. 修改分类创建接口的权限验证逻辑
移除原来错误的密码验证,改为检查session中是否存在用户信息:
routeCategory.post("/category", (req, res) => { // 优先验证用户是否已登录 if (!req.session.user) { return res.status(401).send("You must be logged in to create a category"); } // 原有参数验证逻辑保留 if (!req.body || !req.body.category_id) { return res.status(400).send("category missing"); } const id = req.body.category_id; const existingCategory = category.categoryData.find( element => element.category_id === id ); if (existingCategory) { return res.status(409).send("Category already exists"); } // 创建分类逻辑保留 const newCategory = { category_id: req.body.category_id, categoryName: req.body.categoryName, }; category.createCategory(newCategory); return res.sendStatus(201); });
额外提醒
- 生产环境中不要明文存储密码,应该用bcrypt等工具对密码进行哈希加密后再存入数据库。
- 如果是前后端分离项目,推荐使用JWT令牌代替session,更适合跨域场景。
内容的提问来源于stack exchange,提问作者Amr Aboelmagd Hussien
相关产品推荐
相关产品推荐

