如何修改权限校验Promise,实现两种编辑权限判定逻辑?
修改Promise路由权限校验逻辑,支持管理员权限
核心修改思路
要实现「用户是帖子创建者 或 是管理员即可编辑」的逻辑,需要完成三件关键调整:
- 修复原代码的SQL注入风险(直接拼接变量属于严重安全漏洞)
- 扩展SQL查询逻辑,同时校验两个权限条件
- 修正Promise错误处理方式(数据库错误应触发
reject而非resolve)
具体修改代码
假设管理员身份存储在users表的is_admin字段(1表示管理员),修改后的代码如下:
const allowEdit = (postid, username) => { return new Promise((resolve, reject) => { // 使用参数化查询避免SQL注入,用EXISTS子查询提升性能 const checkPermissionQuery = ` SELECT EXISTS( SELECT 1 FROM post p WHERE p.id = ? AND ( p.username = ? OR EXISTS(SELECT 1 FROM users u WHERE u.username = ? AND u.is_admin = 1) ) ) AS has_permission `; // 传入参数数组,对应SQL中的?占位符 db.query(checkPermissionQuery, [postid, username, username], (err, results) => { if (err) { console.log("authorized ===", err); return reject(err); // 数据库错误时触发Promise的reject } // 将查询结果转换为布尔值,直接返回权限状态 const hasPermission = results[0].has_permission === 1; resolve(hasPermission); }); }); };
适配不同管理员存储方式
如果管理员信息存在单独的admin表(仅存储管理员的username),只需替换SQL语句:
SELECT EXISTS( SELECT 1 FROM post p WHERE p.id = ? AND ( p.username = ? OR EXISTS(SELECT 1 FROM admin a WHERE a.username = ?) ) ) AS has_permission
代码说明
- SQL注入防护:通过
db.query的参数数组传递变量,彻底杜绝直接拼接SQL带来的注入风险 - 高效查询:使用
EXISTS子查询,数据库仅需判断是否存在满足条件的记录,无需返回完整数据,性能更优 - 清晰的权限结果:直接返回布尔值
hasPermission,调用方可以快速判断是否允许编辑 - 正确的错误处理:数据库错误时调用
reject(err),让调用方通过.catch()统一处理异常
调用示例
allowEdit(101, "alice") .then((canEdit) => { if (canEdit) { // 执行编辑逻辑 console.log("允许编辑帖子"); } else { // 提示无权限 console.log("无编辑权限"); } }) .catch((error) => { // 处理数据库异常 console.error("权限校验失败:", error); });
内容的提问来源于stack exchange,提问作者ohsand
相关产品推荐
相关产品推荐

