Django权限管理的机制
- Django权限管理的实现, 基于 User Group Permission,这个权限管理机制, 将模型类中的某个属于model的permission赋予user或者group, group在后台管理中就是角色的意思
默认的权限
-
在INSTALL_APPS 里设置了django.contrib.auth 时, 在一次迁移的时候,将为模型类创建四个默认权限: 添加. 修改. 删除和查看
-
Django自动生成的表结构
-
auth_group的表结构
-
auto_group_permissions表结构
-
auto_permission表结构
以编程的方式的创建权限
- 在项目中, auto_permission表中自动生成的权限可能不是我们需要的, 我们可以手动添加
from myapp.models import Tnews
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
# 新闻表中权限
news_content_type = ContentType.objects.get_for_model(Tnews)
Permission.objects.update_or_create(codename='news_add', name='添加新闻', content_type=house_content_type)
添加角色
- 项目中需要哪些角色, 自己添加哪些角色, 操作Group, 简介操作的是 auto_group表
from django.contrib.auth.models import Group
from rest_framework.viewsets import ModelViewSet
class RoleManagerView(ModelViewSet):
"""角色管理视图"""
queryset = Group.objects.all()
# 关闭分页
# pagination_class = None
serializer_class = serializes.RoleManagerSerializer
给角色Group赋权限
- 获取这个Group的实例对象, 获取需要添加的permission对象, 给角色添加权限
from django.contrib.auth.models import Group
# 获取某个角色
instance = Group.objects.get(id=2)
# 获取所有权限列表
Permission.objects.all()
# 获取单条权限
permissino1 = Permission.objects.get(id=200)
# 将权限添加到Group中
instance.permissions.add(permissino1)
# 其他权限的操作
# 设置权限, 会清空之前的所有权限,传入一个权限列表
instance.permissions.set([permission1...])
# 清空所有的权限
instance.permissions.clear()
# 查看所有的权限
instance.permissions.all()
给用户赋角色
- settings文件中设置好User模型类后, 迁移会生成 user表__groups 角色用户关系表, 查出group的对象, 用户添加这个组中
from django.contrib.auth.models import Group
from user.models import User
user = User.objects.get(id=1)
# 获取一个角色
group1 = Group.objects.get(id=1)
# 将该用户添加到这个组中
user.groups.add(group1)
# 其他操作
# 查看这个用户的所有的组
user.groups.all()
# 清空这个用户的组
user.groups.clear()
# 设置组, 会清空之前的所有组,传入一个组列表
user.groups.set([group1])
给用户赋值权限
- User对象的user_permission字段管理用户的权限
user = User.objects.get(id=1)
user.user_permissions = [permission_list]
user.user_permissions.add(permission, permission, …) #增加权限
user.user_permissions.remove(permission, permission, …) #删除权限
user.user_permissions.clear() #清空权限
user.get_all_permissions() #列出用户的所有权限
user.get_group_permissions() # 列出用户所属group的权限
权限验证的使用
1. 装饰器函数使用
- 在视图中验证权限 permission_required装饰器
from django.contrib.auth.decorators import login_required, permission_required
2. view视图中代码验证
if not request.user.has_perm('news.news_lb_manager')
3. 模板中使用
# 登录权限
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
# 是否有权限
{% if perms.news.news_lb_manager%}
有权限
{% endif %}