一、什么是权限控制?
权限控制(Access Control) 是计算机系统中 限制用户/程序对资源的访问 的安全机制,其核心目标是:
- 安全性:防止未授权访问敏感数据或功能
- 合规性:满足法律法规对数据隐私的要求
- 资源管理:合理分配系统操作权限
在 Web 开发中,权限控制通常表现为:
- 身份验证(Authentication):确认用户是谁
- 授权(Authorization):确定用户能做什么
二、Django 权限控制的三个维度
Django 的权限系统围绕 资源类型 和 操作粒度 设计,主要分为三个层次:
1. 模型级权限(Model-Level)
定义:控制用户对 整个数据模型 的操作权限
Django 原生支持:
-
每个模型自动获得 4 个默认权限(add/change/delete/view)
-
通过
Meta
类添加自定义权限:class Article(models.Model): class Meta: permissions = [ ("publish_article", "Can publish article"), ("archive_article", "Can archive article"), ]
控制方式:
# 视图层
from django.contrib.auth.decorators import permission_required
@permission_required('app.publish_article')
def publish_view(request):
...
# 模板层
{% if perms.app.publish_article %}
<button>发布文章</button>
{% endif %}
2. 对象级权限(Object-Level)
定义:控制用户对 特定数据实例 的操作权限
原生局限:Django 默认不提供对象级权限
扩展方案:
-
使用第三方库
django-guardian
-
手动实现校验逻辑:
def edit_article(request, article_id): article = get_object_or_404(Article, id=article_id) if not request.user == article.author: raise PermissionDenied ...
3. 业务逻辑权限(Business Logic)
定义:根据 动态条件 限制操作权限
典型场景:
- 时间限制:仅允许在特定时间段操作
- 状态限制:只有 “草稿” 状态可编辑
- 组合条件:部门经理 + 金额>1万需上级审批
实现方式:
def approve_expense(request, expense_id):
expense = Expense.objects.get(id=expense_id)
# 复合权限校验
if not (request.user.has_perm('app.approve_expense') and
expense.amount < 10000 and
expense.status == 'pending'):
raise PermissionDenied
expense.approve()
三、Django 权限实现机制
1. 权限存储结构
数据库表 | 作用 |
---|---|
auth_permission | 存储所有定义的权限 |
auth_user_user_permissions | 用户-权限关系表 |
auth_group_permissions | 用户组-权限关系表 |
2. 权限验证流程
sequenceDiagram
participant User
participant Middleware
participant View
User->>Middleware: 发起请求
Middleware->>View: 解析请求
View->>View: 检查权限装饰器/Mixin
alt 有权限
View->>User: 返回正常响应
else 无权限
View->>User: 返回403 Forbidden
end
3. 核心验证方法
方法/属性 | 作用 | 示例 |
---|---|---|
user.has_perm('codename') | 验证用户是否拥有某个权限 | user.has_perm('app.add_user') |
user.get_all_permissions() | 获取用户所有权限(包括组权限) | 用于权限列表展示 |
@permission_required | 视图函数装饰器 | 控制整个视图访问 |
PermissionRequiredMixin | 类视图权限控制基类 | 配合 ListView 使用 |
四、权限控制设计原则
- 最小权限原则:用户只拥有完成工作所需的最低权限
- 显式拒绝原则:默认拒绝所有权限,明确授予必要权限
- 定期审查原则:通过审计日志检查权限分配合理性
- 分层管理原则:
- 管理员:管理用户和权限分配
- 普通用户:使用被授予的权限
五、典型应用场景
- 内容管理系统(CMS)
- 作者:可创建/编辑自己的文章
- 编辑:可修改所有文章
- 管理员:管理用户权限
- 电商后台系统
- 客服:查看订单,不可修改价格
- 运营:上下架商品
- 财务:导出交易数据
- 企业OA系统
- 部门审批流程权限
- 文档访问范围控制
通过掌握这些核心概念,您已具备设计 Django 基础权限系统的能力! 🚀