当前位置:首页 > VUE

vue实现登录权限控制

2026-02-20 18:57:27VUE

实现登录权限控制的基本思路

Vue中实现登录权限控制通常涉及路由守卫、状态管理和接口拦截。核心逻辑是在用户未登录时拦截非法访问,跳转到登录页;登录后根据权限动态加载可访问的路由。

路由守卫配置

router/index.js中配置全局前置守卫,通过meta字段标记需要权限的路由:

const router = new VueRouter({
  routes: [
    {
      path: '/dashboard',
      component: Dashboard,
      meta: { requiresAuth: true }
    }
  ]
})

router.beforeEach((to, from, next) => {
  const isAuthenticated = store.getters.isLoggedIn
  if (to.matched.some(record => record.meta.requiresAuth) && !isAuthenticated) {
    next('/login')
  } else {
    next()
  }
})

状态管理实现

使用Vuex存储登录状态和用户权限信息:

// store/modules/auth.js
const state = {
  token: localStorage.getItem('token') || '',
  userInfo: null
}

const mutations = {
  SET_TOKEN(state, token) {
    state.token = token
    localStorage.setItem('token', token)
  },
  SET_USER_INFO(state, userInfo) {
    state.userInfo = userInfo
  }
}

const actions = {
  login({ commit }, credentials) {
    return axios.post('/api/login', credentials).then(res => {
      commit('SET_TOKEN', res.data.token)
      commit('SET_USER_INFO', res.data.user)
    })
  }
}

动态路由加载

根据用户权限动态添加路由:

// 定义基础路由和动态路由
const basicRoutes = [...]
const asyncRoutes = [...]

// 在登录成功后加载权限路由
function loadRoutes(roles) {
  const allowedRoutes = asyncRoutes.filter(route => {
    return !route.meta.roles || route.meta.roles.includes(roles)
  })
  router.addRoutes(allowedRoutes)
}

API请求拦截

在axios拦截器中添加token验证:

axios.interceptors.request.use(config => {
  const token = store.state.auth.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
})

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

按钮级权限控制

通过自定义指令实现按钮级别的权限控制:

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:delete'">删除</button>

登录状态持久化

通过localStoragecookie实现登录状态持久化:

// 初始化时从本地存储恢复状态
if (localStorage.getItem('token')) {
  store.commit('SET_TOKEN', localStorage.getItem('token'))
  axios.get('/api/userinfo').then(res => {
    store.commit('SET_USER_INFO', res.data)
  })
}

退出登录处理

清除存储的状态和本地数据:

actions: {
  logout({ commit }) {
    commit('SET_TOKEN', '')
    commit('SET_USER_INFO', null)
    localStorage.removeItem('token')
    router.push('/login')
  }
}

以上方案实现了完整的登录权限控制流程,包括路由拦截、状态管理、动态路由加载和接口权限验证。实际项目中可根据具体需求调整权限粒度。

vue实现登录权限控制

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

相关文章

vue实现跑车

vue实现跑车

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

vue实现管道

vue实现管道

Vue 中实现管道(Pipe)功能 在 Vue 中可以通过过滤器(Filters)或计算属性(Computed Properties)实现类似管道的功能,将数据经过多个处理步骤后输出。 使用过滤器…

vue 动画 实现

vue 动画 实现

vue 动画实现方法 Vue 提供了多种方式实现动画效果,主要包括过渡动画和动态动画两类。 使用 <transition> 组件实现基础过渡 通过 Vue 内置的 <transi…

vue实现123456

vue实现123456

Vue 实现数字 123456 的显示 在 Vue 中显示数字 123456 非常简单,可以通过以下方法实现: 方法一:直接在模板中显示 <template> <div&…

vue实现书库

vue实现书库

Vue 实现书库功能 使用 Vue 构建书库功能需要结合前端框架和后端数据管理。以下是实现步骤和关键点: 项目初始化 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 和…

vue实现修改

vue实现修改

Vue 实现修改功能的方法 在 Vue 中实现修改功能通常涉及表单绑定、状态管理和 API 调用。以下是几种常见实现方式: 双向数据绑定实现表单修改 使用 v-model 指令绑定表单元素与组件数…