You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:37:25