如何解析字符串格式的用户ID列表,校验用户是否拥有内容查看权限?
针对分隔符格式用户ID的校验与权限控制方案
一、数据库层面的查询校验(直接过滤符合权限的任务)
因为字段存储格式为-ID1-ID2-ID3-,可以利用SQL的LIKE语句精准匹配用户ID,避免部分匹配的问题(比如ID=1不会误匹配ID=10)。修改你的Laravel查询代码如下:
$tasks = Tasks::with('uprcomp','street','houses', 'otvets', 'created_user') ->where('status','0') ->where(function($query) use ($user_id) { // 任务创建者直接有权限 $query->where('user_id', $user_id) // 负责人字段(若为单个ID则直接匹配,若为分隔符格式可参照下方修改) ->orWhere('f8820', $user_id) // 观察者字段f8830:匹配包含-$user_id-的字符串 ->orWhere('f8830', 'LIKE', "%-$user_id-%") // 协同执行者字段f8840:同上 ->orWhere('f8840', 'LIKE', "%-$user_id-%") // 观察者字段f11580:同上 ->orWhere('f11580', 'LIKE', "%-$user_id-%"); }) ->orderBy('id', 'desc') ->paginate(25);
注意事项:
- 如果
f8820(负责人)字段也采用分隔符存储多个ID,同样需要改成LIKE匹配方式; - 使用
%-$user_id-%而非%$user_id%,是为了避免匹配到类似123中的23这种部分ID的情况,保证精准匹配。
二、代码层面的权限校验(单个任务的权限验证)
如果需要对单个任务实例校验用户是否有权限查看,可以通过以下步骤实现:
- 拆分字段字符串为ID数组,过滤空元素(因为前后的
-会导致拆分后出现空字符串) - 检查用户ID是否在目标数组中
示例代码:
// 假设$task是Tasks模型实例 $userId = auth()->id(); // 当前登录用户ID $hasPermission = false; // 检查是否是创建者或负责人 if ($task->user_id == $userId || $task->f8820 == $userId) { $hasPermission = true; } // 检查是否在观察者列表(f8830) $observers = array_filter(explode('-', $task->f8830)); if (in_array($userId, $observers)) { $hasPermission = true; } // 检查是否在协同执行者列表(f8840) $coExecutors = array_filter(explode('-', $task->f8840)); if (in_array($userId, $coExecutors)) { $hasPermission = true; } // 检查是否在另一个观察者列表(f11580) $otherObservers = array_filter(explode('-', $task->f11580)); if (in_array($userId, $otherObservers)) { $hasPermission = true; } // 根据权限状态处理逻辑 if (!$hasPermission) { abort(403, '无查看权限'); }
三、优化建议
这种用分隔符存储多个ID的方式,在数据量较大时会影响查询性能,且不利于维护。建议优化数据库结构:
- 建立关联表(如
task_observers、task_co_executors),采用多对多关联的方式存储任务与用户的关系; - 利用Laravel的Eloquent关联模型,更便捷地实现权限查询与管理。
内容的提问来源于stack exchange,提问作者Rondo
相关产品推荐
相关产品推荐

