编写可组合的权限后端:ABAC 属性级控制
超越 Django 内置权限系统,实现基于属性的访问控制(ABAC)后端,支持动态规则如时间、IP、用户属性组合。 · 难度:入门 · +10XP
ABAC 权限后端
Django 默认权限模型为角色基础(RBAC),但复杂业务需要属性级控制。本教程将指导你编写自定义 AuthBackend,从 request 中提取属性(用户部门、请求时间、资源标签),通过规则引擎(如 simple-rules)进行决策。你将学会实现 has_perm 与 has_module_perms 方法,并集成 django-guardian 对象级别权限。
from django.contrib.auth.backends import BaseBackend
class AttributeBackend(BaseBackend):
def has_perm(self, user_obj, perm, obj=None):
# 获取规则配置
rules = getattr(settings, 'ABAC_RULES', [])
for rule in rules:
if self._evaluate_rule(rule, user_obj, obj):
return True
return False
def _evaluate_rule(self, rule, user, obj):
# 实现属性匹配
return (user.role == rule.get('role') and
obj.owner == user)