R / Richie全部文章 ↑

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 已经把用户所属组的所有权限累加起来。