1.添加权限系统

默认权限系统:在 settings.py 中 INSTALL_APPS 的 django.contrib.auth

注意:其控制的最小粒度是表(例如,用户组设置了模型Blog的删除权限,该组用户可以删除其中任意文章,而并非自己发布的)

2.默认权限

2.1. Django 默认权限

一个模型,默认拥有 4 个权限:

  1. 添加:add_modelName
  2. 删除:delete_modelName
  3. 修改:change_modelName
  4. 查看:view_modelName

2.2. 修改默认权限

(如果使用 Django 后台,最好保留默认权限)

  1. class Blog(models.Model):
  2. title = models.CharField(max_length=256, verbose_name='标题')
  3. content = models.TextField(blank=True, null=True, verbose_name='内容')
  4. class Meta:
  5. default_permissions = () # 清空默认的权限
  6. permissions = ( # 设置新的权限
  7. ("change_blog", "修改博客"), # 格式:(权限名称, 描述)
  8. ("delete_blog", "查看博客"),
  9. ("publish_blog", "发布博客"),
  10. )

3. 自定义权限

3.1. 创建新权限

  1. from .models import BlogPost
  2. from django.contrib.auth.models import Permission
  3. from django.contrib.contenttypes.models import ContentType
  4. content_type = ContentType.objects.get_for_model(BlogPost)
  5. permission = Permission.objects.create(
  6. codename='can_publish',
  7. name='Can Publish Posts',
  8. content_type=content_type,
  9. )

3.2. 设置用户和组的权限

3.2.1. 用户

  1. my_user = User.objects.get(id=2)
  2. my_user.user_permissions.add(25, 26) # 添加权限:原有基础上新增
  3. my_user.user_permissions.set([26, 27]) # 设置权限:清空原有权限
  4. my_user.user_permissions.remove(26, 27) # 移除权限
  5. my_user.user_permissions.clear() # 清空权限

3.2.2. 组

  1. my_group = Group.objects.get(id=1)
  2. my_group.permissions.set([26,27])
  3. my_group.permissions.remove(25)
  4. my_group.permissions.clear()
  5. my_group.permissions.add(25) # 25 是 Permission 的 ID
  6. my_permission = Permission.objects.get(id=25)
  7. my_group.permissions.add(my_permission) # 也可以为 Permission 对象

3.2.3. 用户和组的操作

3.2.3.1. 将用户添加到组

  1. my_user1 = User.objects.get(id=1) # 用户对象
  2. my_user2 = User.objects.get(id=2)
  3. my_group = Group.objects.get(id=1) # 组对象
  4. my_group.user_set.set([my_user1, my_user2]) # 添加用户(们)到组

3.2.3.2. 获取用户所在组

  1. my_user = User.objects.get(id=2)
  2. my_group = Group.objects.get(user=my_user)
  3. my_group.name

4. 使用权限

4.1. 查看权限

get_all_permissions(), get_group_permissions()

  1. my_user = User.objects.get(username='my_name')
  2. my_user.get_all_permissions() # 列出用户所有权限
  3. my_user.get_group_permissions() # 列出用户所属组的权限
  4. # {'blog.publish_blog', 'blog.delete_blog', 'auth.add_group', 'blog.change_blog'}

4.2. 验证权限

4.2.1. has_perm() 是否有权限

  1. my_user = User.objects.get(username='my_name')
  2. my_user.has_perm('blog.change_blog') # 参数为:appName.codename
  3. # True

比如

  1. # views.py
  2. def my_view(request):
  3. if not request.user.has_perm('blog.change_blog')
  4. return HttpResponse('403 Forbidden')

4.2.2. @permission_required() 装饰器

  1. from django.contrib.auth.decorators import permission_required
  2. @permission_required('blog.change_blog')
  3. def my_view(request):
  4. #...

@permission_required 包括以下参数:

  1. @permission_required(perm, login_url=None, raise_exception=False)
  2. # perm: 参数 appName.codename
  3. # login_url: 没有权限时跳转的登录页(raise_exception为False)
  4. # raise_exception: 为 True 时,显示 403 错误,不跳转

4.3. 模板中使用

当前登陆用户的权限保存在模版变量 {{ perms }}

  1. {% if perms.cmdb.view_project %}
  2. <li><a href="#"></i> 如果有权限</a></li>
  3. {% endif %}