1.添加权限系统
默认权限系统:在 settings.py
中 INSTALL_APPS 的 django.contrib.auth
注意:其控制的最小粒度是表(例如,用户组设置了模型Blog的删除权限,该组用户可以删除其中任意文章,而并非自己发布的)
2.默认权限
2.1. Django 默认权限
一个模型,默认拥有 4 个权限:
- 添加:add_modelName
- 删除:delete_modelName
- 修改:change_modelName
- 查看:view_modelName
2.2. 修改默认权限
(如果使用 Django 后台,最好保留默认权限)
class Blog(models.Model):
title = models.CharField(max_length=256, verbose_name='标题')
content = models.TextField(blank=True, null=True, verbose_name='内容')
class Meta:
default_permissions = () # 清空默认的权限
permissions = ( # 设置新的权限
("change_blog", "修改博客"), # 格式:(权限名称, 描述)
("delete_blog", "查看博客"),
("publish_blog", "发布博客"),
)
3. 自定义权限
3.1. 创建新权限
from .models import BlogPost
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.create(
codename='can_publish',
name='Can Publish Posts',
content_type=content_type,
)
3.2. 设置用户和组的权限
3.2.1. 用户
my_user = User.objects.get(id=2)
my_user.user_permissions.add(25, 26) # 添加权限:原有基础上新增
my_user.user_permissions.set([26, 27]) # 设置权限:清空原有权限
my_user.user_permissions.remove(26, 27) # 移除权限
my_user.user_permissions.clear() # 清空权限
3.2.2. 组
my_group = Group.objects.get(id=1)
my_group.permissions.set([26,27])
my_group.permissions.remove(25)
my_group.permissions.clear()
my_group.permissions.add(25) # 25 是 Permission 的 ID
my_permission = Permission.objects.get(id=25)
my_group.permissions.add(my_permission) # 也可以为 Permission 对象
3.2.3. 用户和组的操作
3.2.3.1. 将用户添加到组
my_user1 = User.objects.get(id=1) # 用户对象
my_user2 = User.objects.get(id=2)
my_group = Group.objects.get(id=1) # 组对象
my_group.user_set.set([my_user1, my_user2]) # 添加用户(们)到组
3.2.3.2. 获取用户所在组
my_user = User.objects.get(id=2)
my_group = Group.objects.get(user=my_user)
my_group.name
4. 使用权限
4.1. 查看权限
get_all_permissions(), get_group_permissions()
my_user = User.objects.get(username='my_name')
my_user.get_all_permissions() # 列出用户所有权限
my_user.get_group_permissions() # 列出用户所属组的权限
# {'blog.publish_blog', 'blog.delete_blog', 'auth.add_group', 'blog.change_blog'}
4.2. 验证权限
4.2.1. has_perm() 是否有权限
my_user = User.objects.get(username='my_name')
my_user.has_perm('blog.change_blog') # 参数为:appName.codename
# True
比如
# views.py
def my_view(request):
if not request.user.has_perm('blog.change_blog')
return HttpResponse('403 Forbidden')
4.2.2. @permission_required() 装饰器
from django.contrib.auth.decorators import permission_required
@permission_required('blog.change_blog')
def my_view(request):
#...
@permission_required
包括以下参数:
@permission_required(perm, login_url=None, raise_exception=False)
# perm: 参数 appName.codename
# login_url: 没有权限时跳转的登录页(raise_exception为False)
# raise_exception: 为 True 时,显示 403 错误,不跳转
4.3. 模板中使用
当前登陆用户的权限保存在模版变量 {{ perms }}
中
{% if perms.cmdb.view_project %}
<li><a href="#"></i> 如果有权限</a></li>
{% endif %}