当前位置:首页 > 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 菜单实现方法 使用 Element UI 的菜单组件 Element UI 提供了现成的菜单组件,适合快速实现导航菜单。安装 Element UI 后,可以直接使用 el-menu 相关组件。…

vue实现订单

vue实现订单

Vue 实现订单功能 订单数据结构设计 订单数据通常包含以下字段: order: { id: String, // 订单ID userId: String,…

vue实现评分

vue实现评分

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

vue 实现循环

vue 实现循环

Vue 实现循环的方法 在 Vue 中,可以使用 v-for 指令来实现循环渲染列表数据。以下是几种常见的循环实现方式: 基本数组循环 <template> <ul>…

vue删除实现

vue删除实现

Vue 删除功能的实现方法 在 Vue 中实现删除功能通常涉及以下几个步骤: 方法一:使用数组的 splice 方法 通过索引删除数组中的元素,适用于列表渲染的场景。 methods: {…

vue实现hexo

vue实现hexo

Vue 集成 Hexo 的实现方法 Hexo 是一个静态博客框架,而 Vue 是一个前端框架。将 Vue 集成到 Hexo 中可以通过以下方式实现: 在 Hexo 中使用 Vue 组件 通过 Hex…