插件权限设计中的越权漏洞:细粒度RBAC实现方案
最近在重构后台权限系统时发现,很多插件只做了简单的菜单权限控制,实际接口层缺乏细粒度校验。分享下基于RBAC模型的实战方案,用Laravel中间件举例:
1. 数据表核心字段设计:
permissions: id,name,guard_name(插件标识) model_has_permissions: permission_id,model_type,model_id roles: id,name,guard_name role_has_permissions: role_id,permission_id特别注意guard_name字段区分不同插件权限域
2. 中间件关键校验逻辑:
public function handle($request, $next, $permission)
{
if (auth()->guard('plugin_admin')->check()) {
if (!auth()->user()->can($permission)) {
abort(403, '无权操作');
}
}
return $next($request);
}
路由中声明中间件:`->middleware('plugin.permission:article.delete')`
3. 前端按钮级控制方案: Vue指令v-permission="'plugin:article.edit'"配合全局混入方法,自动隐藏无权限操作项。特别注意动态路由参数场景下的权限校验,比如编辑ID=123的文章时需要二次验证归属权限。
常见坑点: - 权限缓存更新延迟(建议使用Tag缓存) - 超级管理员绕过校验(需显式调用skipPermission) - 批量操作时的循环校验性能问题(采用预加载+内存校验)
最新打赏


QQ官方交流群