在实际开发中,需要设置用户只能查看哪些部门的数据,这种情况一般称为数据权限。
    例如对于销售,财务的数据,它们是非常敏感的,因此要求对数据权限进行控制, 对于基于集团性的应用系统而言,就更多需要控制好各自公司的数据了。如设置只能看本公司、或者本部门的数据,对于特殊的领导,可能需要跨部门的数据, 因此程序不能硬编码那个领导该访问哪些数据,需要进行后台的权限和数据权限的控制。
    提示
    默认系统管理员admin拥有所有数据权限(userId=1),默认角色拥有所有数据权限(如不需要数据权限不用设置数据权限操作)
    提示
    关于数据权限使用流程
    支持参数如下:

    参数 类型 默认值 描述
    deptAlias String 部门表的别名
    userAlias String 用户表的别名

    1、在(系统管理-角色管理)设置需要数据权限的角色 目前支持以下几种权限

    • 全部数据权限
    • 自定数据权限
    • 部门数据权限
    • 部门及以下数据权限
    • 仅本人数据权限

    2、在需要数据权限控制方法上添加@DataScope注解,其中du用来表示表的别名

    1. // 部门数据权限注解
    2. @DataScope(deptAlias = "u")
    3. // 部门及用户权限注解
    4. @DataScope(deptAlias = "d", userAlias = "u")

    3、在mybatis查询底部标签添加数据范围过滤

    <!-- 数据范围过滤 -->
    ${params.dataScope}
    

    用户管理(未过滤数据权限的情况):

    select u.user_id, u.dept_id, u.login_name, u.user_name, u.email
        , u.phonenumber, u.password, u.sex, u.avatar, u.salt
        , u.status, u.del_flag, u.login_ip, u.login_date, u.create_by
        , u.create_time, u.remark, d.dept_name
    from sys_user u
        left join sys_dept d on u.dept_id = d.dept_id
    where u.del_flag = '0'
    

    用户管理(已过滤数据权限的情况):

    select u.user_id, u.dept_id, u.login_name, u.user_name, u.email
        , u.phonenumber, u.password, u.sex, u.avatar, u.salt
        , u.status, u.del_flag, u.login_ip, u.login_date, u.create_by
        , u.create_time, u.remark, d.dept_name
    from sys_user u
        left join sys_dept d on u.dept_id = d.dept_id
    where u.del_flag = '0'
        and u.dept_id in (
            select dept_id
            from sys_role_dept
            where role_id = 2
        )
    

    结果很明显,我们多了如下语句。通过角色部门表(sys_role_dept)完成了数据权限过滤

    and u.dept_id in (
        select dept_id
        from sys_role_dept
        where role_id = 2
    )
    

    逻辑实现代码 com.runyang.framework.aspectj.DataScopeAspect
    提示
    仅实体继承BaseEntity才会进行处理,SQL语句会存放到BaseEntity对象中的params属性中供xml参数params.dataScope获取。