当前位置:首页 > 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页面分离的实现方法 将Vue页面分离为多个组件或模块,有助于提升代码可维护性和复用性。以下是几种常见的实现方式: 组件化拆分 通过将页面拆分为多个子组件,每个组件负责特定功能或UI部分。使用i…

vue实现打字机

vue实现打字机

Vue实现打字机效果 在Vue中实现打字机效果可以通过动态更新文本内容并添加延迟来实现。以下是几种常见的实现方法: 使用setInterval实现 <template> <d…

vue聊天实现

vue聊天实现

Vue 聊天应用实现步骤 创建 Vue 项目 使用 Vue CLI 或 Vite 初始化项目,安装必要依赖(如 Vue 3、Element UI 或 Vuetify 用于 UI 组件)。 npm c…

vue实现跑车

vue实现跑车

Vue 实现跑车动画效果 使用 Vue 结合 CSS 动画可以实现跑车在屏幕上移动的效果。以下是一个完整的实现方案: 创建 Vue 组件结构 <template> <div…

vue树形实现

vue树形实现

Vue 树形组件实现方法 使用递归组件实现树形结构 递归组件是 Vue 中实现树形结构的常见方法。通过组件调用自身的方式,可以轻松构建多层嵌套的树形结构。 <template> &…

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…