当前位置:首页 > 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 实现选择分类的方法 使用 v-model 绑定选择值 在 Vue 中可以通过 v-model 指令实现双向数据绑定,适用于下拉选择框(<select>)。以下是一个基本示例:…

vue登录逻辑的实现

vue登录逻辑的实现

Vue 登录逻辑实现 前端实现 创建登录组件 在 Vue 项目中创建一个登录组件,通常命名为 Login.vue。该组件包含表单元素,如用户名和密码输入框,以及提交按钮。 <template&…

拖拽式编程vue实现

拖拽式编程vue实现

拖拽式编程在 Vue 中的实现方法 使用 HTML5 原生拖放 API Vue 可以结合 HTML5 的拖放 API 实现基础拖拽功能。通过 draggable 属性标记可拖拽元素,监听 dragst…

vue实现打字机

vue实现打字机

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

vue实现简单的弹窗

vue实现简单的弹窗

使用 Vue 实现简单弹窗 组件基础结构 创建一个名为 Modal.vue 的组件文件,包含模板、脚本和样式部分: <template> <div class="modal-…

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-fo…