当前位置:首页 > 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 项目中实现权限管理通常涉及路由控制、按钮权限和接口权限。以下是几种常见的实现方式: 路由权限控制 通过动态路由的方式,根据用户权限加载不同的路由配置。可以使用…

vue 实现权限

vue 实现权限

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

vue实现权限分离

vue实现权限分离

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

vue实现前端权限

vue实现前端权限

Vue 前端权限实现方案 前端权限控制的核心在于根据用户角色或权限动态控制页面访问、菜单展示和操作按钮。以下是几种常见的实现方式: 基于路由的权限控制 通过路由守卫拦截未授权访问,动态生成可访问…

uniapp权限分配

uniapp权限分配

权限分配的基本概念 在UniApp中,权限分配通常涉及前端权限控制(如页面访问、按钮操作)和后端权限验证(如API接口权限)。前端权限可通过路由守卫、自定义指令等方式实现,后端权限需结合服务端逻辑(如…

vue实现菜单权限

vue实现菜单权限

基于路由的动态菜单权限控制 在Vue中实现菜单权限通常需要结合路由配置和用户角色/权限数据。以下是常见的实现方法: 路由配置中添加权限标识 // router.js const routes…