9.2 权限管理
2025-02-17
Django会为应用程序中的每一个Model创建三个默认权限:添加、更改和删除。
9.2.1 定义权限的数据表
Django利用Permission表定义权限:auth_permission
- 权限与用户的关联表:
auth_user_user_permission - 权限与用户组的关联表:
auth_group_permission - Django的权限时基于Model的。Django提供的是
表级别的权限控制
9.2.2 给Model添加自定义权限
- 在定义Model时指定自定义的权限:在Model的Meta中声明
class Topic(BaseModel):
class Meta:
permissions = (
('can_view_topic','Can View Topic'),
)
# permissions是一个二元组,第一个元素指定了权限的codename,第二个元素指定了权限的name执行makemigrations migrate
python manage.py makemigrations post
python manage.py migrate
mysql> select * from auth_permission where content_type_id = 8;自定义权限
由于业务的需要,也可以使用代码的形式创建自定义权限,需要执行两个步骤
- 获取某个应用的ContentType实例
- 给定codename(不能与当前的codename存在重复)和name以及获取的ContentType创建Permission实例
例子:给Tipic在添加一个权限
from post.models import Topic
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
codename = 'can_publish_topic'
name = 'Can Publish Topic'
content_type = ContentType.objects.get_for_model(Topic)
Permission.objects.create(codename=codename, name=name, content_type=content_type)9.2.3 权限的授予与校验
添加,删除以及清空权限
1. 用户bbs权限操作
User实例添加属性需要使用:user_permissions属性,先获取User对象和Permission对象实例
from django.contrib.auth.models import User, Permission bbs = User.objects.get(username='bbs') add_topic = Permission.objects.get(codename='add_topic') change_topic = Permission.objects.get(codename='change_topic')get_all_permissions:查看User对象实例所授予的权限bbs.get_all_permissions()user_permissions.set:设置当前用户的权限bbs.user_permessions.set(add_topic)user_permissions.add:给User对象在拥有权限的基础上添加权限bbs.user_permissions.add(change_topic) bbs.user_permissions.add(add_topic, change_topic)user_permissions.remove:删除权限bbs.user_permissions.remove(add_topic, change_topic)user_permissions.clear(): 清空权限bbs.user_permissions.clear()
2. 用户组bbs的权限操作
permissions.set():给用户组bbs设置权限from django.contrib.auth.models import Group group_bbs = Group.objects.get(name='bbs') group_bbs.permissions.set([add_topic, change_topic]) bbs.get_all_permissions() bbs = User.objects.get(username='bbs') bbs.get_all_permissions()
3. 用户权限校验
- 可以使用User实例的has_perm或has_perms方法
- has_perm:判断用户是否有某一项权限
- has_perms:判断用户是否同时拥有多个权限
- 格式
- has_perm
<app label>.<permission codename>- app label: 应用名
- permission codename:权限编码
- has_perm
- 返回:
True:正确
False:失败
bbs.has_perm('post.add_topic') bbs.has_perms(['post.add_topic','post.change_topic'])