2019-03-25 14:25:28 1115浏览
今天扣丁学堂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全栈开发免费公开课】