Django内置权限扩展案例 (4)

如上图系统中有很多功能是需要根据项目、环境查询对应的DB信息的,对于此类接口也需要控制用户只能查询自己有权限读的DB实例,管理员能查看所有,代码如下:

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)

实现思路与上边类似,只是多了一步根据项目和环境再进行判断

需要根据group去反查都有哪些DB实例包含了该组,这里用到了M2M的related_name属性:group.read.all()

更多关于Django ORM查询的内容可以看这篇文章Django model select的各种用法详解有详细的总结

执行操作权限控制

除了上边的两个场景之外我们还需要在执行具体的操作之前去判断是否有权限,例如执行审核操作前判断用户是否对此DB有写权限

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspjzx.html