当前位置:首页 > VUE

django vue 实现权限管理

2026-01-21 16:31:53VUE

实现 Django 和 Vue 的权限管理

后端 (Django)

安装必要依赖 确保 Django 和 Django REST framework 已安装,推荐使用以下包:

pip install djangorestframework django-cors-headers djangorestframework-simplejwt

配置 Django 项目settings.py 中添加以下配置:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'corsheaders',
    'rest_framework_simplejwt',
]

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

CORS_ALLOWED_ORIGINS = [
    "http://localhost:8080",
]

创建用户和权限模型 扩展 Django 的默认用户模型或使用内置模型:

from django.contrib.auth.models import AbstractUser, Group, Permission

class CustomUser(AbstractUser):
    pass

设置权限装饰器和类 在视图或视图集中使用权限控制:

from rest_framework.decorators import permission_classes
from rest_framework.permissions import IsAdminUser

@permission_classes([IsAdminUser])
def admin_only_view(request):
    ...

前端 (Vue)

安装必要依赖 使用 Vue CLI 创建项目并安装必要依赖:

npm install axios vue-router vuex

配置路由和权限控制router/index.js 中设置路由守卫:

import store from '../store'

router.beforeEach((to, from, next) => {
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth)
  const userRole = store.getters.userRole

  if (requiresAuth && !userRole) {
    next('/login')
  } else if (requiresAuth && to.meta.roles && !to.meta.roles.includes(userRole)) {
    next('/403')
  } else {
    next()
  }
})

实现权限指令 创建自定义指令检查元素级权限:

django vue 实现权限管理

Vue.directive('permission', {
  inserted: function (el, binding, vnode) {
    const userRoles = vnode.context.$store.getters.userRoles
    if (!userRoles.includes(binding.value)) {
      el.parentNode.removeChild(el)
    }
  }
})

使用示例

<button v-permission="'admin'">管理员按钮</button>

前后端交互

登录和获取令牌 在 Vue 中实现登录逻辑:

axios.post('/api/token/', {
  username: 'user',
  password: 'pass'
}).then(response => {
  localStorage.setItem('access_token', response.data.access)
  localStorage.setItem('refresh_token', response.data.refresh)
})

请求拦截器 为所有请求添加 JWT 令牌:

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

权限数据结构示例

后端权限结构

django vue 实现权限管理

{
    "model": "auth.permission",
    "fields": {
        "name": "Can add user",
        "content_type": 1,
        "codename": "add_user"
    }
}

前端权限映射

const permissionMap = {
  'add_user': '创建用户',
  'change_user': '修改用户',
  'delete_user': '删除用户'
}

动态菜单实现

根据权限过滤菜单

computed: {
  filteredMenu() {
    return this.allMenuItems.filter(item => {
      return !item.permission || this.$store.getters.hasPermission(item.permission)
    })
  }
}

菜单项配置示例

{
  path: '/admin',
  name: 'Admin',
  meta: {
    permission: 'admin_access'
  }
}

错误处理

403 错误页面 创建专用组件处理权限不足情况:

<template>
  <div class="error-page">
    <h1>403 Forbidden</h1>
    <p>您没有权限访问此页面</p>
  </div>
</template>

拦截 403 响应

axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 403) {
      router.push('/403')
    }
    return Promise.reject(error)
  }
)

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

相关文章

vue 实现权限

vue 实现权限

Vue 实现权限控制的方法 在 Vue 项目中实现权限控制通常涉及前端路由权限、按钮权限和 API 权限等多个层面。以下是几种常见的实现方式: 基于路由的权限控制 使用 Vue Router 的全局…

vue实现权限

vue实现权限

Vue 权限实现方案 权限控制在 Vue 项目中通常分为前端路由权限和页面元素权限两部分。以下是常见的实现方式: 路由权限控制 通过路由守卫实现页面访问权限,未授权用户无法访问特定路由。 //…

vue指令实现权限

vue指令实现权限

Vue 指令实现权限控制 在 Vue 中,可以通过自定义指令来实现前端权限控制。以下是一种常见的实现方式: 自定义权限指令 // 在 main.js 或单独的文件中定义指令 Vue.directi…

vue实现登录权限

vue实现登录权限

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

vue实现权限分离

vue实现权限分离

Vue 实现权限分离的方法 在 Vue 项目中实现权限分离通常涉及前端路由控制、组件级权限和接口权限管理。以下是几种常见的实现方式: 基于路由的权限控制 通过动态路由的方式,根据用户权限加载不同的路…

vue实现权限管理

vue实现权限管理

Vue 权限管理实现方案 权限管理通常分为路由权限和功能权限两部分,以下是常见的实现方式: 路由权限控制 动态路由加载 通过用户角色或权限标识动态生成可访问的路由表。在路由守卫中校验权限:…