2019-03-25 14:25:28 1906瀏覽
今天扣丁學(xué)堂Python培訓(xùn)老師給大家分享一篇關(guān)于Django內(nèi)置權(quán)限擴(kuò)展案例詳解,文中通過示例代碼介紹的非常詳細(xì),下面我們一起來看一下吧。class Mysql(models.Model): Env = ( (1, 'Dev'), (2, 'Qa'), (3, 'Prod'), ) create_time = models.DateTimeField(auto_now_add=True, verbose_name='創(chuàng)建時間') 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='環(huán)境') master_host = models.GenericIPAddressField(verbose_name='master主機(jī)') master_port = models.IntegerField(default=3306, verbose_name='master端口') slave_host = models.GenericIPAddressField(null=True, verbose_name='slave主機(jī)') slave_port = models.IntegerField(null=True, default=3306, verbose_name='slave端口') database = models.CharField(max_length=64, verbose_name='數(shù)據(jù)庫') read_groups = models.ManyToManyField(Group, related_name='read', verbose_name='讀權(quán)限') write_groups = models.ManyToManyField(Group, related_name='write', verbose_name='寫權(quán)限') description = models.TextField(null=True, verbose_name='備注')
列表頁權(quán)限控制
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() # 構(gòu)造一個空的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})
查詢接口權(quán)限控制
def get_project_database(request, project, environment): if request.method == 'GET': _jsondata = {} if request.user.is_superuser: # 返回所有項目和環(huán)境匹配的DB _lists = Mysql.objects.filter( project_id=int(project), environment=int(environment) ) _jsondata = {i.id: i.database for i in _lists} else: # 只返回用戶有權(quán)限查詢的DB _user_groups = request.user.groups.all() for group in _user_groups: # 循環(huán)mysql表中有read_groups權(quán)限的所有組 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): # 如果用戶是超級管理員則有權(quán)限 if user.is_superuser: return True # 取出用戶所屬的所有組 _user_groups = user.groups.all() # 取出Mysql對應(yīng)權(quán)限的所有組 if perm == 'read': _mysql_groups = mysql.read_groups.all() if perm == 'write': _mysql_groups = mysql.write_groups.all() # 用戶組和DB權(quán)限組取交集,有則表示有權(quán)限,否則沒有權(quán)限 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的查詢權(quán)限 if check_permission('read', _host, request.user) == False: return JsonResponse({'state': 0, 'message': '當(dāng)前用戶沒有查詢此DB的權(quán)限'})
【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】 【掃碼進(jìn)入Python全棧開發(fā)免費公開課】
查看更多關(guān)于"Python開發(fā)資訊"的相關(guān)文章>