PHP栏目权限校验需严格类型匹配、预处理防注入、支持继承与缓存,推荐Laravel Gate/Policy;易漏点:API未校验栏目权限、前端渲染与后端查询脱节、用户维度缓存未分离。
PHP中用 in_array() 判断用户栏目权限是否生效
最常用也最容易出错的方式,是把用户拥有的栏目 ID 列表(比如从数据库查出的 $userAllowedCats)和当前请求的栏目 ID($currentCatId)做简单比对。但要注意:这个数组必须是纯整型或严格字符串类型,否则 in_array('5', [5, 10], true) 会返回 false。
实操建议:
- 从数据库读取权限时统一用
array_map('intval', $rawIds)转成整型数组 - 判断前先检查
$userAllowedCats是否为数组且非空,避免 Warning - 不要依赖 session 中未校验的原始数据,每次鉴权前应重新加载或验证缓存有效性
基于 RBAC 模型查 category_permission 关联表做动态鉴权
当栏目权限支持「角色-栏目-操作」三级控制(如编辑/查看/删除),就不能只靠 ID 列表硬匹配。典型做法是拼接 SQL 查询关联表,例如:
SELECT COUNT(*) FROM category_permission WHERE role_id = ? AND cat_id = ? AND action = 'view'
关键点:
立即学习“PHP免费学习笔记(深入)”;