You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改权限校验Promise,实现两种编辑权限判定逻辑?

修改Promise路由权限校验逻辑,支持管理员权限

核心修改思路

要实现「用户是帖子创建者 或 是管理员即可编辑」的逻辑,需要完成三件关键调整:

  1. 修复原代码的SQL注入风险(直接拼接变量属于严重安全漏洞)
  2. 扩展SQL查询逻辑,同时校验两个权限条件
  3. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:01:16