当前位置:首页 > VUE

vue实现登录权限

2026-01-14 04:19:08VUE

路由守卫实现权限控制

在Vue项目中,可以通过路由守卫(Navigation Guards)来控制页面访问权限。在router/index.js中配置全局前置守卫:

router.beforeEach((to, from, next) => {
  const isAuthenticated = localStorage.getItem('token')
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!isAuthenticated) {
      next({ path: '/login' })
    } else {
      next()
    }
  } else {
    next()
  }
})

路由配置中添加元信息标记需要认证的页面:

{
  path: '/dashboard',
  component: Dashboard,
  meta: { requiresAuth: true }
}

登录状态管理

使用Vuex管理用户登录状态和token信息:

const store = new Vuex.Store({
  state: {
    token: null,
    userInfo: null
  },
  mutations: {
    setToken(state, token) {
      state.token = token
      localStorage.setItem('token', token)
    },
    clearToken(state) {
      state.token = null
      localStorage.removeItem('token')
    }
  },
  actions: {
    login({ commit }, credentials) {
      return axios.post('/api/login', credentials)
        .then(response => {
          commit('setToken', response.data.token)
        })
    }
  }
})

动态路由配置

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

vue实现登录权限

function generateRoutes(userRoles) {
  const baseRoutes = [...]
  const adminRoutes = userRoles.includes('admin') ? [...] : []
  return [...baseRoutes, ...adminRoutes]
}

router.addRoutes(generateRoutes(user.roles))

权限指令实现

创建自定义指令控制元素显示权限:

Vue.directive('permission', {
  inserted: (el, binding, vnode) => {
    const { hasPermission } = vnode.context
    if (!hasPermission(binding.value)) {
      el.parentNode.removeChild(el)
    }
  }
})

在组件中使用:

<button v-permission="'create-user'">创建用户</button>

登录页面实现

典型登录表单处理:

vue实现登录权限

methods: {
  handleLogin() {
    this.$store.dispatch('login', this.form)
      .then(() => {
        this.$router.push(this.$route.query.redirect || '/')
      })
      .catch(error => {
        this.error = error.message
      })
  }
}

接口请求拦截

在axios拦截器中添加token:

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

错误处理

统一处理401未授权错误:

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

持久化登录状态

在应用初始化时恢复登录状态:

new Vue({
  created() {
    const token = localStorage.getItem('token')
    if (token) {
      this.$store.commit('setToken', token)
    }
  }
})

以上方案实现了完整的登录权限控制流程,包括路由守卫、状态管理、动态路由、权限指令等核心功能,可根据实际项目需求进行调整和扩展。

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

相关文章

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 meth…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <templat…

vue 实现挂载

vue 实现挂载

Vue 实现挂载的基本方法 在 Vue 中,挂载是将 Vue 实例与 DOM 元素关联的过程。通过挂载,Vue 可以管理 DOM 并实现数据绑定和响应式更新。 创建 Vue 实例并挂载 con…

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…

vue实现答辩

vue实现答辩

Vue 实现答辩系统的关键步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目,安装 Vue Router 管理路由,Pinia/Vuex 进行状态管理。配置 ESLint 和 Pre…

vue搜索实现

vue搜索实现

Vue 搜索功能实现方法 基于计算属性的搜索 在 Vue 中可以通过计算属性实现简单的搜索功能。这种方式适合小型数据集,利用 JavaScript 的 filter 方法进行筛选。 data()…