前端菜单权限控制怎么做才安全?
我最近在做后台管理系统,菜单要根据用户角色动态显示。现在是前端拿到用户权限列表后,用 v-if="hasPermission('user:list')" 这种方式控制菜单项显示,但听说这样不安全,因为用户能改前端代码绕过限制,是真的吗?
那正确的做法是不是应该后端也返回可访问的菜单结构?比如接口直接返回用户能看到的菜单树,而不是前端自己过滤?我试过让后端返回菜单数据,但不确定怎么和路由匹配起来,有没有成熟的方案?
现在我的菜单配置是这样的:
const menus = [
{ path: '/users', name: '用户管理', permission: 'user:list' },
{ path: '/roles', name: '角色管理', permission: 'role:list' }
]
至于菜单和路由,比较成熟且安全的方案确实是让后端返回用户有权限访问的路由树。前端拿到数据后,利用前端路由的动态添加功能(比如 Vue Router 的 addRoute)生成路由。这样前端就不保存全量路由配置,页面结构对不可见的用户来说是黑盒。
具体实现上,你可以把前端的路由组件映射关系维护好,后端只返回 path 和 component 对应的字符串。下面是一个基于 Vue Router 的处理示例,演示如何把后端返回的菜单数据转换成真实路由:
这种方式下,如果后端没给某个菜单,前端根本就不知道有这个路由,直接访问也会被路由守卫拦截。最后再强调一遍,无论前端做得多么花哨,后端接口的鉴权校验绝对不能省,否则就是掩耳盗铃。