数据工厂系列(15)项目管理模块-引入项目权限功能

121 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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))

关联功能修改

  • 项目操作权限

项目权限相关接口: 新增用户权限、编辑用户权限、删除用户权限、获取项目权限列表这里要加入项目操作权限的逻辑

项目管理相关接口: 编辑项目、删除项目这里要加入项目操作权限的逻辑

项目模块路由函数改动:

新增项目这里我们还是保持不变,只有组长和超级管理才能创建项目

总结

今天完成了设计项目权限相关的逻辑,并在某些接口引入项目权限进行限制,下一期我们来讲讲项目的初始化!