当前位置:首页 > VUE

vue实现权限登录

2026-02-19 01:02:39VUE

Vue 实现权限登录方案

路由权限控制

使用 Vue Router 的全局前置守卫 beforeEach 进行路由拦截,结合 meta 字段标记权限。未登录用户访问受限路由时重定向到登录页。

// router.js
router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token')
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth)

  if (requiresAuth && !isAuthenticated) {
    next('/login')
  } else {
    next()
  }
})

动态菜单生成

根据用户权限数据动态生成侧边栏菜单,通常需要后端返回权限树结构。使用 v-if 或递归组件渲染菜单。

// 示例权限数据结构
const permissionTree = [
  {
    path: '/dashboard',
    name: 'Dashboard',
    meta: { title: '控制台', icon: 'dashboard' }
  },
  {
    path: '/admin',
    name: 'Admin',
    meta: { role: 'admin' }
  }
]

按钮级权限

通过自定义指令 v-permission 控制按钮显示,或使用权限判断函数包裹按钮。

vue实现权限登录

// main.js
Vue.directive('permission', {
  inserted(el, binding) {
    const permissions = store.getters.permissions
    if (!permissions.includes(binding.value)) {
      el.parentNode.removeChild(el)
    }
  }
})

// 使用方式
<button v-permission="'user:delete'">删除</button>

接口权限控制

在 axios 拦截器中添加 token,后端根据 token 校验权限。401 状态码时清除本地存储并跳转登录页。

// http.js
axios.interceptors.request.use(config => {
  config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`
  return config
})

axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

状态管理

使用 Vuex 集中管理用户权限信息,通过 getters 提供权限判断方法。

vue实现权限登录

// store.js
const store = new Vuex.Store({
  state: {
    permissions: []
  },
  mutations: {
    SET_PERMISSIONS(state, permissions) {
      state.permissions = permissions
    }
  },
  getters: {
    hasPermission: state => permission => {
      return state.permissions.includes(permission)
    }
  }
})

登录流程示例

用户登录成功后存储 token 并获取权限数据,跳转到首页前初始化权限系统。

// Login.vue
async handleLogin() {
  try {
    const res = await loginApi(this.form)
    localStorage.setItem('token', res.data.token)
    const permissions = await getPermissionApi()
    this.$store.commit('SET_PERMISSIONS', permissions)
    this.$router.push('/')
  } catch (error) {
    console.error(error)
  }
}

权限数据持久化

考虑使用 sessionStorage 或 cookie 存储 token,页面刷新时重新获取权限数据。

// App.vue
created() {
  if (localStorage.getItem('token')) {
    this.$store.dispatch('getUserInfo')
  }
}

注意事项

  1. 后端接口必须进行权限校验,前端控制仅为体验优化
  2. 敏感路由应添加 404 兜底处理
  3. 生产环境建议使用 https 保护 token 传输
  4. 定期更新 token 有效期机制
  5. 退出登录时清除所有权限相关存储

实现完整的权限系统通常需要前后端协同设计,上述方案可根据实际项目需求进行组合或调整。

标签: 权限vue
分享给朋友:

相关文章

vue实现页面截屏

vue实现页面截屏

使用html2canvas库实现截屏 html2canvas是一个流行的JavaScript库,可以将DOM元素转换为Canvas图像。在Vue项目中安装html2canvas: npm insta…

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template> &l…

vue实现粘贴

vue实现粘贴

Vue 实现粘贴功能的方法 在 Vue 中实现粘贴功能通常涉及监听粘贴事件并处理剪贴板数据。以下是几种常见的实现方式: 监听原生粘贴事件 通过 @paste 指令或原生 addEventListen…

vue实现gps

vue实现gps

Vue 中实现 GPS 定位功能 在 Vue 中实现 GPS 定位功能通常依赖于浏览器的 Geolocation API 或第三方地图服务(如高德、百度地图等)。以下是两种常见的实现方式: 使用浏览…

vue实现评分

vue实现评分

Vue 实现评分功能 使用组件库实现 安装 element-ui 或 ant-design-vue 这类 UI 库,它们已经内置了评分组件。 以 element-ui 为例: <te…

vue 实现图片

vue 实现图片

Vue 实现图片加载与展示的方法 在 Vue 中实现图片加载和展示可以通过多种方式完成,以下是一些常见的方法: 使用 v-bind 绑定图片路径 通过 v-bind(或简写为 :)动态绑定图片的…