如何在Django中创建应用专属用户角色与权限体系?
Django多应用用户角色管理系统搭建方案
一、核心数据库模型设计
要实现用户在不同应用下的独立角色分配,需要构建4层关联模型:用户(复用Django内置User)、应用、角色、用户-应用-角色关联表。
- 应用模型:存储系统内的各个独立应用信息
from django.db import models from django.contrib.auth.models import User class App(models.Model): name = models.CharField(max_length=100, unique=True, verbose_name="应用名称") desc = models.TextField(blank=True, verbose_name="应用描述") def __str__(self): return self.name
- 角色模型:绑定到具体应用,每个应用可定义专属角色及权限
class Role(models.Model): app = models.ForeignKey(App, on_delete=models.CASCADE, related_name="roles", verbose_name="所属应用") name = models.CharField(max_length=100, verbose_name="角色名称") # 用逗号分隔权限标识,也可扩展为多对多关联Django内置Permission模型 permissions = models.TextField(verbose_name="权限列表(如:view_data,edit_data)") def __str__(self): return f"{self.app.name} - {self.name}"
- 用户-应用-角色关联表:确保单个用户在同一应用下仅能分配一个角色
class UserAppRole(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="app_roles", verbose_name="用户") app = models.ForeignKey(App, on_delete=models.CASCADE, verbose_name="应用") role = models.ForeignKey(Role, on_delete=models.CASCADE, verbose_name="角色") class Meta: unique_together = ("user", "app") # 避免同一用户在同一应用下重复分配角色 def __str__(self): return f"{self.user.username} - {self.app.name} - {self.role.name}"
二、权限校验实现
自定义装饰器,用于校验用户在当前应用下的角色权限:
from django.http import HttpResponseForbidden from .models import UserAppRole def require_app_role(app_name, required_permissions=None): def decorator(view_func): def wrapper(request, *args, **kwargs): # 未登录用户直接拦截 if not request.user.is_authenticated: return HttpResponseForbidden("请先登录") try: # 获取用户在目标应用下的角色 user_app_role = UserAppRole.objects.get(user=request.user, app__name=app_name) role_permissions = [p.strip() for p in user_app_role.role.permissions.split(",")] # 检查是否具备所需权限 if required_permissions: for perm in required_permissions: if perm not in role_permissions: return HttpResponseForbidden("无此应用操作权限") return view_func(request, *args, **kwargs) except UserAppRole.DoesNotExist: return HttpResponseForbidden("未分配该应用角色") return wrapper return decorator
在视图中使用示例:
from django.shortcuts import render from .decorators import require_app_role @require_app_role("订单管理系统", required_permissions=["view_order"]) def order_list(request): # 订单列表视图逻辑 return render(request, "order/list.html")
三、Django后台管理配置
注册模型到后台,优化角色分配的操作体验:
from django.contrib import admin from .models import App, Role, UserAppRole # 应用编辑页内嵌角色管理 class RoleInline(admin.TabularInline): model = Role extra = 1 class AppAdmin(admin.ModelAdmin): inlines = [RoleInline] list_display = ("name", "desc") # 用户-应用-角色关联表的后台配置 class UserAppRoleAdmin(admin.ModelAdmin): list_display = ("user", "app", "role") list_filter = ("app", "role") search_fields = ("user__username", "app__name") admin.site.register(App, AppAdmin) admin.site.register(Role) admin.site.register(UserAppRole, UserAppRoleAdmin)
四、前端角色展示示例
在用户个人中心模板中展示其各应用角色:
{% if user.is_authenticated %} <div class="user-role-panel"> <h3>我的应用角色</h3> <ul> {% for app_role in user.app_roles.all %} <li>{{ app_role.app.name }}:{{ app_role.role.name }}</li> {% empty %} <li>暂未分配任何应用角色</li> {% endfor %} </ul> </div> {% endif %}
内容的提问来源于stack exchange,提问作者Ghimeray Govinda
相关产品推荐
相关产品推荐

