2019-03-25 14:25:28 1144浏览
今天扣丁学堂Python培训老师给大家分享一篇关于Django内置权限扩展案例详解,文中通过示例代码介绍的非常详细,下面我们一起来看一下吧。class Mysql(models.Model): Env = ( (1, 'Dev'), (2, 'Qa'), (3, 'Prod'), ) create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') project_id = models.IntegerField(verbose_name='项目') project_tmp = models.CharField(max_length=128, default='') environment = models.IntegerField(choices=Env, verbose_name='环境') master_host = models.GenericIPAddressField(verbose_name='master主机') master_port = models.IntegerField(default=3306, verbose_name='master端口') slave_host = models.GenericIPAddressField(null=True, verbose_name='slave主机') slave_port = models.IntegerField(null=True, default=3306, verbose_name='slave端口') database = models.CharField(max_length=64, verbose_name='数据库') read_groups = models.ManyToManyField(Group, related_name='read', verbose_name='读权限') write_groups = models.ManyToManyField(Group, related_name='write', verbose_name='写权限') description = models.TextField(null=True, verbose_name='备注')
列表页权限控制
def mysql(request):
if request.method == 'GET':
if request.user.is_superuser:
_lists = Mysql.objects.all().order_by('id')
else:
# 获取登录用户的所有组
_user_groups = request.user.groups.all()
# 构造一个空的QuerySet然后合并
_lists = Mysql.objects.none()
for group in _user_groups:
_lists = _lists | group.read.all()
return render(request, 'overmind/mysql.index.html', {'request': request, 'lPage': _lists})
查询接口权限控制
def get_project_database(request, project, environment):
if request.method == 'GET':
_jsondata = {}
if request.user.is_superuser:
# 返回所有项目和环境匹配的DB
_lists = Mysql.objects.filter(
project_id=int(project),
environment=int(environment)
)
_jsondata = {i.id: i.database for i in _lists}
else:
# 只返回用户有权限查询的DB
_user_groups = request.user.groups.all()
for group in _user_groups:
# 循环mysql表中有read_groups权限的所有组
for mysql in group.read.all():
if mysql.project_id == int(project) and mysql.environment == int(environment):
_jsondata[mysql.id] = mysql.database
return JsonResponse(_jsondata)
def check_permission(perm, mysql, user): # 如果用户是超级管理员则有权限 if user.is_superuser: return True # 取出用户所属的所有组 _user_groups = user.groups.all() # 取出Mysql对应权限的所有组 if perm == 'read': _mysql_groups = mysql.read_groups.all() if perm == 'write': _mysql_groups = mysql.write_groups.all() # 用户组和DB权限组取交集,有则表示有权限,否则没有权限 group_list = list(set(_user_groups).intersection(set(_mysql_groups))) return False if len(group_list) == 0 else True
def query(request):
if request.method == 'POST':
postdata = request.body.decode('utf-8')
_host = get_object_or_404(Mysql, id=int(postdata.get('database')))
# 检查用户是否有DB的查询权限
if check_permission('read', _host, request.user) == False:
return JsonResponse({'state': 0, 'message': '当前用户没有查询此DB的权限'})
【关注微信公众号获取更多学习资料】 【扫码进入Python全栈开发免费公开课】