我在做后台管理系统,用户登录后根据角色动态渲染菜单和按钮。现在用 v-if 判断权限,但发现通过浏览器开发者工具还是能手动把按钮显示出来,这有安全隐患吧?
比如下面这段 CSS,我原本想用 display: none 配合权限类名来隐藏:
.btn-delete {
display: none;
}
.role-admin .btn-delete {
display: inline-block;
}
但这样其实 DOM 还在,懂点前端的人删掉类名就能看到按钮了。是不是必须在服务端彻底不返回这些元素才安全?前端还有别的办法吗?
服务端必须做的事情:
每个敏感的 API 接口都要做权限校验。比如删除用户这个操作,后端收到请求时先查一下当前用户有没有删除权限,没有就直接返回 403。前端隐藏按钮只是不让用户“误点”,真正防止恶意操作靠的是后端这道墙。
前端能做的事情:
后端返回用户权限标识(比如一个 permission 数组),前端根据这个动态渲染菜单和按钮。这是提升用户体验的,让不同角色看到不同的界面,但别把它当安全措施。
简单实现思路:
后端接口 /api/user/info 返回用户信息,里面带个 permissions 字段,比如 ["user:add", "user:delete", "user:edit"]
前端登录后存到 store 或者 localStorage 里:
模板里这样用:
这个指令的作用是,如果用户没有这个权限,直接把 DOM 节点删掉,比 display: none 强一点,但依然只是前端辅助手段。
总结一下:
后端在 API 层面做权限校验是必须的,前端动态渲染只是锦上添花。两者配合着用:后端保安全,前端优化体验。单独靠前端隐藏敏感按钮,迟早要出问题。