在实际开发中,需要设置用户只能查看哪些部门的数据,这种情况一般称为数据权限。 例如对于销售,财务的数据,它们是非常敏感的,因此要求对数据权限进行控制, 对于基于集团性的应用系统而言,就更多需要控制好各自公司的数据了。 注意: 若依代码生成 的实体类会默认继承。 2、在系统管理设置角色在(系统管理-角色管理)设置需要数据权限的角色 目前支持以下几种权限 全部数据权限 自定数据权限 部门数据权限 部门及以下数据权限 仅本人数据权限 3、添加@DataScope注解在需要数据权限控制方法(一般就是XXXXXXServiceImpl)上添加@DataScope注解。 注解参数说明 参数 类型 默认值 描述 解释deptAlias String 空 部门表的别名 就是sql语句中有部门权限标识的表的名字 userAlias String 空 用户表的别名 就是sql语句中有用户权限标识的表的名字 部门数据权限注解 @DataScope(deptAlias = "d") public List<...> select(...) { return mapper.select(...); }部门及用户权限注解 @DataScope(deptAlias = "d", userAlias = "u") public List<...> select(...) { return mapper.select(...); } 4、添加数据范围过滤在src/main/resources/mapper/xxxx/xxxxxMapper.xml中查询底部标签添加数据范围过滤。 例2: <select parameterType="..." resultMap="...Result"> <include refid="select...Vo"/> <where> <!-- 添加下面两行到查询语句的where语句块内 --> <!-- 数据范围过滤 --> ${params.dataScope} </where> </select> 实现原理实现原理就是sql语句的拼接,在where语句后面拼接了查询权限的sql语句。 深度分析链接简单理解如下: 未过滤数据权限的情况下的用户管理: 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 )注意 @RequiresAuthentication 使用该注解标注的类,实例,方法在访问或调用时,当前Subject必须在当前session中已经过认证。 @RequiresGuest 使用该注解标注的类,实例,方法在访问或调用时,当前Subject可以是gust身份,不需要经过认证或者在原先的session中存在记录。 @RequiresPermissions 当前Subject需要拥有某些特定的权限时,才能执行被该注解标注的方法。如果当前Subject不具有这样的权限,则方法不会被执行。 @RequiresRoles 当前Subject必须拥有所有指定的角色时,才能访问被该注解标注的方法。如果当天Subject不同时拥有所有指定角色,则方法不会执行还会抛出AuthorizationException异常。 @RequiresUser 当前Subject必须是应用的用户,才能访问或调用被该注解标注的类,实例,方法。 @RequiresRoles @RequiresRoles注解用于配置接口要求用户拥有某(些)角色才可访问,它拥有两个参数 参数 类型 描述value String[] 角色列表 logical Logical 角色之间的判断关系,默认为Logical.AND 示例1: 以下代码表示必须拥有admin角色才可访问 @RequiresRoles("admin") public AjaxResult save(...) { return AjaxResult.success(...); }示例2: 以下代码表示必须拥有admin和common角色才可访问 @RequiresRoles({"admin", "common"}) public AjaxResult save(...) { return AjaxResult.success(...); }示例3: 以下代码表示需要拥有admin或common角色才可访问 @RequiresRoles(value = {"admin", "common"}, logical = Logical.OR) public AjaxResult save(...) { return AjaxResult.success(...); } @RequiresPermissions@RequiresPermissions注解用于配置接口要求用户拥有某(些)权限才可访问,它拥有两个参数 参数 类型 描述 示例2: 以下代码表示必须拥有system:user:add和system:user:update权限才可访问 @RequiresPermissions({"system:user:add", "system:user:update"}) public AjaxResult save(...) { return AjaxResult.success(...); }示例3: 以下代码表示需要拥有system:user:add或system:user:update角色才可访问 @RequiresPermissions(value = {"system:user:add", "system:user:update"}, logical = Logical.OR) public AjaxResult save(...) { return AjaxResult.success(...); }提示 |