持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
大家好~我是小方,欢迎大家关注笋货测试笔记体完记得俾个like呀
回顾
上一期,我们已经完成了项目权限管理的基础功能开发,但是相关的权限管理控制我们都没有引入,那今天我们来引入项目的权限管理吧~
需求
我们先来分析一下,目前权限可以分为3种,第一种是查看权限,第二种是操作权限,第三种是数据权限
- 项目查看权限
顾名思义就是你配有这个项目的权限,就可以查看这个项目,初始化这个项目,写完脚本后可以同步这个项目,同步完之后,你可以看到这个脚本,并且可以执行脚本
- 项目操作权限
操作权限在这里的意义是真正执行的动作,影响平台的数据,目前数据工厂上的操作还是挺多的,譬如项目的编辑,删除,项目权限管理的新增,删除,修改,获取项目权限成员列表···
- 项目列表数据权限
目前项目列表的数据是所有人都可以访问的,但这个不符合我们的初衷,我们要根据项目权限,返回符合用户权限范围内的数据
项目列表数据权限梳理
可以访问到项目列表数据的大致分为3点:
- 超级管理员
- 公开的项目
- 该用户权限范围内的项目
我们先在ProjectRoleDao
里写个方法,获取用户权限范围内的项目,这里只需要返回项目的id好了
@classmethod
@record_log
def project_by_user(cls, user):
"""
根据用户获取权限范围内项目
:param user: 用户数据
:return:
"""
with Session() as session:
projects = session.query(DataFactoryProjectRole.project_id).filter(DataFactoryProjectRole.user_id == user['id'],
DataFactoryProjectRole.del_flag == 0).all()
return [i[0] for i in projects]
接着我们来编写实际逻辑,在ProjectDao
编写过滤条件(逻辑)
@classmethod
def user_all_projects(cls, user):
filter_list = []
# 如果不是管理员角色
if user['role'] != Permission.ADMIN:
# 找出用户权限范围内的所有项目
project_ids = ProjectRoleDao.project_by_user(user)
# 公开的项目 或者 权限范围内的项目 或者 项目负责人的项目
filter_list.append(or_(DataFactoryProject.id.in_(project_ids), DataFactoryProject.owner == user['id'],
DataFactoryProject.private == False))
return filter_list
如果是管理员,无需过滤条件,如果不是管理员,先找出用户权限范围内的所有项目id,再加上公开项目、项目负责人项目即可,这三个条件满足其一即可,项目列表接口加上这个过滤条件
路由函数也改一下
大家这里可以写几条测试用例测这个接口哈,这里先不展开啦~
项目查看权限
老规矩,先来捋一下项目的查看权限
- 超级管理员不限制
- 项目负责人可以查看
- 已经配有该项目的权限
在ProjectRoleDao
新建以下方法
@classmethod
@record_log
def read_permission(cls, project_id: int, user: dict) -> None:
"""判断是否有项目查看权限"""
if user['role'] == Permission.ADMIN:
# 超管不限制
return
with Session() as session:
project = session.query(DataFactoryProject).filter(DataFactoryProject.id == project_id,
DataFactoryProject.del_flag == 0).first()
if project is None: raise NormalException("项目不存在")
if project.owner == user['id']:
# 项目负责人可以查看
return
else:
# 查询是否在项目配有权限
project_role = session.query(DataFactoryProjectRole).filter(DataFactoryProjectRole.user_id == user['id'],
DataFactoryProjectRole.project_id == project_id,
DataFactoryProjectRole.del_flag == 0).first()
if project_role is None:
raise NormalException(f"对不起,你没有{project.project_name}项目权限!!!")
如果是超级管理员,就直接return,如果不是,先判断用户是否为该项目的负责人,是,直接return,不是的话,查询是否已配有该项目权限,没配置直接抛出异常
- 路由函数
app/routers/project/project.py
新建路由函数
@router.get("/read", name="判断是否有项目查看权限", response_model=ResponseDto)
def read_project(id: int, user = Depends(Auth())):
try:
ProjectRoleDao.read_permission(id, user)
return ResponseDto()
except Exception as e:
raise NormalException(str(e))
大家这里也可以写几条测试用例测这个接口哈,这里先不展开啦~
项目操作权限
我们来捋一下项目的操作权限
- 超级管理员和项目负责人不限制
- 已经配有该项目的权限且角色为项目组长
在ProjectRoleDao
新建以下方法
@classmethod
@record_log
def operation_permission(cls, project_id, user):
"""判断是否有项目操作权限"""
with Session() as session:
project = session.query(DataFactoryProject).filter(DataFactoryProject.id == project_id,
DataFactoryProject.del_flag == 0).first()
if project is None: raise Exception("项目不存在")
if user['role'] == Permission.ADMIN or project.owner == user['id']:
# 超管 或者 项目负责人可以操作
return
else:
# 非超管 或者 非项目负责人
role_query = session.query(DataFactoryProjectRole).filter(DataFactoryProjectRole.user_id == user['id'],
DataFactoryProjectRole.project_id == project_id, DataFactoryProjectRole.del_flag ==0 ).first()
if role_query is None or role_query.project_role == Permission.MEMBERS:
# 查询为空 或者 项目权限为组员
raise Exception(f"对不起,你没有{project.project_name}项目操作权限!!!")
else:
# 组长可以操作
return
根据项目id查询项目的信息,如果用户是超级管理员或者项目负责人,直接return;如果都不是,就查一下是否有配置项目权限,没配置或者配置的权限为组员角色,直接抛出异常,否则直接return
- 路由函数
app/routers/project/project.py
新建路由函数
@router.get("/operation", name="判断用户是否有项目操作权限")
def operation_project(id: int, user = Depends(Auth())):
try:
ProjectRoleDao.operation_permission(id, user)
return ResponseDto()
except Exception as e:
raise NormalException(str(e))
关联功能修改
- 项目操作权限
项目权限相关接口: 新增用户权限、编辑用户权限、删除用户权限、获取项目权限列表这里要加入项目操作权限的逻辑
项目管理相关接口: 编辑项目、删除项目这里要加入项目操作权限的逻辑
项目模块路由函数改动:
新增项目这里我们还是保持不变,只有组长和超级管理才能创建项目
总结
今天完成了设计项目权限相关的逻辑,并在某些接口引入项目权限进行限制,下一期我们来讲讲项目的初始化!
- 项目地址
- 今日已提交代码
- 后端:6e9c295