基于管理员角色的SQL条件查询问题:Superadmin如何全量拉取数据
解决按管理员角色过滤数据的SQL问题
问题分析
你当前的SQL思路方向是对的,但存在两个明显问题:
- 直接把
${req.body.superadmin}拼进SQL字符串有SQL注入风险,绝对不能这么写 - 用
LIKE '%%'匹配全部数据的写法可以简化,CASE表达式的逻辑也可以更严谨
正确实现方案
方案一:优化CASE表达式写法
当用户是Superadmin时,让FoldersID等于自身(永远为真,即返回全量数据),否则匹配指定ID:
// 必须用参数化查询,示例以通用参数化格式为例 let sql = `SELECT * FROM DossierCompletMobile WHERE FoldersID = CASE WHEN ? = 1 THEN FoldersID ELSE ? END`; // 执行SQL时传入参数:[req.body.superadmin, 'AD451340-E774-4F6C-9398-ADC8E496A792']
方案二:用逻辑OR实现,可读性更强
这种写法逻辑更直观,更容易维护:
let sql = `SELECT * FROM DossierCompletMobile WHERE ? = 1 OR FoldersID = ?`; // 执行SQL时传入参数:[req.body.superadmin, 'AD451340-E774-4F6C-9398-ADC8E496A792']
重要提醒
- 无论用哪种方案,都要使用参数化查询替代字符串拼接,避免SQL注入攻击
- 如果非Superadmin用户的对应FolderID是动态值(不是固定的
AD451340-E774-4F6C-9398-ADC8E496A792),只需要把第二个参数换成用户对应的角色ID即可
内容的提问来源于stack exchange,提问作者Sb Zakaria
相关产品推荐
相关产品推荐

