Python · 1 分钟阅读
权限管理
Django 权限是 基于 Model 的表级权限,每个 Model 默认拥有
add/change/delete三个权限。
涉及的数据表
| 表 | 作用 |
|---|---|
auth_permission |
权限主表 |
auth_user_user_permissions |
用户 ↔ 权限 |
auth_group_permissions |
组 ↔ 权限 |
auth_user_groups |
用户 ↔ 组 |
定义自定义权限
方式一:Meta 声明
class Topic(BaseModel):
class Meta:
permissions = (
("can_publish_topic", "Can Publish Topic"),
("can_feature_topic", "Can Feature Topic"),
)
执行 makemigrations + migrate 后,权限写入 auth_permission。
方式二:代码创建
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
ct = ContentType.objects.get_for_model(Topic)
Permission.objects.create(
codename="can_publish_topic",
name="Can Publish Topic",
content_type=ct,
)
授予与回收
from django.contrib.auth.models import User, Group, Permission
user = User.objects.get(username="bbs")
publish_perm = Permission.objects.get(codename="can_publish_topic")
# 直接赋权
user.user_permissions.add(publish_perm)
user.user_permissions.remove(publish_perm)
user.user_permissions.clear()
# 通过组
group = Group.objects.create(name="editor")
group.permissions.set([publish_perm])
user.groups.add(group)
校验
user.has_perm("post.can_publish_topic") # 单个
user.has_perms(["post.can_publish_topic", ...]) # 多个(AND)
user.get_all_permissions() # 全部
权限编码格式:<app_label>.<codename>。
模板中使用
{% if perms.post.can_publish_topic %}
<button>发布</button>
{% endif %}
user.has_perm已经把用户所属组的所有权限累加起来。