基于属性的访问控制(ABAC)后端实现
超越 RBAC,根据请求上下文(用户属性、资源属性、环境)动态计算权限。 · 难度:入门 · +10XP
基于属性的访问控制(ABAC)后端实现
Django 内建 permission 只支持角色-权限二元关系。本课教你编写自定义认证后端,实现 ABAC:定义策略规则文件(JSON/YAML),根据用户部门、文档密级、访问时间等属性动态判定。你将扩展 ModelBackend.has_perm,并配合信号机制缓存策略决策,提升性能。
# abac_backend.py
from django.contrib.auth.backends import ModelBackend
from myapp.policy_engine import evaluate_policy
class ABACBackend(ModelBackend):
def has_perm(self, user_obj, perm, obj=None):
# 先检查 Django 自带权限
if super().has_perm(user_obj, perm, obj):
return True
# ABAC 策略校验
return evaluate_policy(user=user_obj, permission=perm, resource=obj)
# policy_engine.py (伪代码)
def evaluate_policy(user, permission, resource):
if user.is_superuser:
return True
# 根据属性规则判断
return user.department == resource.owner_department and \
user.clearance >= resource.security_level