标准答案

  1. 登录态和页面访问权限一般放在路由守卫里,进入页面前判断 token、用户信息、角色或权限码。
  2. 按钮权限可以用自定义指令、权限组件或简单的 computed 判断,适合控制按钮、菜单、操作入口是否展示。
  3. 路由权限解决“能不能进页面”,按钮权限解决“页面里能不能看到或点击某操作”,二者不能互相替代。
  4. 前端权限不能作为安全边界,接口仍然必须由后端校验用户身份、资源归属和操作权限。
  5. 权限数据要有稳定模型,例如角色、权限码、资源动作关系,不能散落成大量硬编码字符串。

题目解析

权限题容易只讲 v-permission 指令,但真正的边界在路由、组件展示和接口安全之间。

前端隐藏按钮只能改善体验,不能阻止用户直接调用接口。只要涉及数据读取、修改、审批、导出,后端必须二次校验。

复杂后台通常要把权限判断封装成 composable 或 store,页面只表达业务意图,不到处拼接角色判断。

代码示例

下面的指令只适合控制展示,不应该替代后端接口鉴权。

TypeScript
app.directive('permission', {
  mounted(el, binding) {
    const required = binding.value
    const permissions = useAuthStore().permissions

    if (!permissions.includes(required)) {
      el.remove()
    }
  }
})
Vue
<template>
  <button v-permission="'order:refund'">
    退款
  </button>
</template>

常见误区

  • 只在前端隐藏按钮,后端接口没有鉴权。
  • 把路由权限、菜单权限、按钮权限混成一套判断,导致页面状态难以解释。
  • 权限码散落在模板里,没有集中命名和复用,后续调整容易漏。

作者信息