当前位置:首页 > VUE

vue实现权限登录

2026-01-18 08:39:23VUE

权限登录实现方案

在Vue中实现权限登录通常涉及前端路由控制、接口权限验证和动态菜单生成。以下是具体实现方法:

登录认证流程

用户提交登录表单后,向后端发送认证请求

axios.post('/api/login', {
  username: 'admin',
  password: '123456'
}).then(response => {
  const token = response.data.token
  localStorage.setItem('user-token', token)
  router.push('/dashboard')
})

后端返回的token需要存储在本地(localStorage或cookie),并在每次请求时携带

axios.interceptors.request.use(config => {
  config.headers['Authorization'] = localStorage.getItem('user-token')
  return config
})

路由权限控制

创建基础路由和动态路由文件

vue实现权限登录

// router.js
const constantRoutes = [
  { path: '/login', component: Login },
  { path: '/404', component: NotFound }
]

const asyncRoutes = [
  { path: '/admin', component: Admin, meta: { roles: ['admin'] }},
  { path: '/user', component: User, meta: { roles: ['user', 'admin'] }}
]

使用路由守卫进行权限验证

router.beforeEach((to, from, next) => {
  const hasToken = localStorage.getItem('user-token')
  if (to.path === '/login') {
    hasToken ? next('/') : next()
  } else {
    hasToken ? checkAccess(to, next) : next('/login')
  }
})

function checkAccess(to, next) {
  const userRoles = store.getters.roles
  if (to.meta.roles) {
    userRoles.some(role => to.meta.roles.includes(role)) 
      ? next() 
      : next('/403')
  } else {
    next()
  }
}

动态菜单生成

根据用户权限过滤可访问路由

function filterRoutes(routes, roles) {
  return routes.filter(route => {
    if (route.meta && route.meta.roles) {
      return roles.some(role => route.meta.roles.includes(role))
    }
    return true
  })
}

将过滤后的路由添加到路由器实例

vue实现权限登录

store.dispatch('user/getInfo').then(roles => {
  const accessedRoutes = filterRoutes(asyncRoutes, roles)
  router.addRoutes(accessedRoutes)
})

按钮级权限控制

创建自定义权限指令

Vue.directive('permission', {
  inserted(el, binding, vnode) {
    const { value } = binding
    const permissions = store.getters.permissions

    if (value && !permissions.includes(value)) {
      el.parentNode && el.parentNode.removeChild(el)
    }
  }
})

在模板中使用指令控制按钮显示

<button v-permission="'user:add'">添加用户</button>

权限数据管理

使用Vuex存储权限相关信息

const store = new Vuex.Store({
  state: {
    token: '',
    roles: [],
    permissions: []
  },
  mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token
    },
    SET_ROLES: (state, roles) => {
      state.roles = roles
    }
  }
})

安全注意事项

  1. 敏感操作需要后端再次验证权限
  2. token应设置合理的过期时间
  3. 考虑实现refresh token机制
  4. 重要数据请求需要防CSRF处理
  5. 生产环境应启用HTTPS

以上方案实现了从登录认证到细粒度权限控制的全流程,可根据实际项目需求进行调整。

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

相关文章

vue优秀实现

vue优秀实现

Vue.js 优秀实现方法 响应式数据管理 使用 Vue 的 ref 和 reactive 处理基础类型和对象类型数据,结合 computed 计算属性优化渲染性能。对于复杂状态,推荐 Pinia 替…

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue实现登出

vue实现登出

实现Vue登出功能 登出功能通常涉及清除用户会话、令牌或本地存储的数据,并重定向到登录页面。以下是几种常见的实现方式: 清除用户令牌和状态 在Vuex的store中定义一个logout mutati…

tabbar 实现 vue

tabbar 实现 vue

在 Vue 中实现 TabBar 功能可以通过多种方式完成,以下是几种常见的方法: 使用 Vue Router 结合自定义组件 创建一个自定义的 TabBar 组件,结合 Vue Router 实现…

vue拖动实现

vue拖动实现

实现 Vue 拖动功能的方法 使用 HTML5 拖放 API 在 Vue 中可以利用 HTML5 的原生拖放 API 实现拖动功能。通过 draggable 属性标记可拖动元素,结合 @dragsta…

vue实现横滚

vue实现横滚

Vue 实现横滚效果 横滚效果通常指水平滚动内容,常见于轮播图、横向导航栏等场景。以下是几种实现方式: 使用 CSS 和 Vue 结合 通过 CSS 的 overflow-x 和 white-spa…