🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 简介 数据权限是大家最为需求也是最广为谈资的一个设计理念。我们需要控制不同的角色、机构人员有查看不同数据范围的权限。如果你动手去设计数据权限,当你去各大平台、百度、谷歌查找设计思路的时候,会发现很难找到有用的资料,很多设计思路局限性非常大。 为了解决这一类疑难问题,JPower提供了俩种配置方式可配合使用 * web在线配置,达到数据权限自动、动态生效的目的。 * 注解方式,针对一些固定使用的方式,避免大量配置使用 ## 数据权限配置 我们访问权限管理->数据权限中可配置不同资源的数据权限 1. 在需要的配置的菜单中点击权限配置,弹出该菜单下的所有配置列表,点击新增可添加配置 ![](https://img.kancloud.cn/bc/54/bc5457fc2813bfd53b3c8fab55427657_3090x1674.png) ![](https://img.kancloud.cn/d5/83/d5837633476a2627c319ad2c0a74b1f8_3102x1806.png) ![](https://img.kancloud.cn/66/ab/66ab17e7181ae3174d38523cd6f061a7_2006x1210.png) 2. **可见字段**代表数据权限最终返回的字段集合,如果是全部则填 * , 如果只需要指定得字段直接填入需要查询得字段用逗号分隔即可,例如只需要id和name两个 字段,则填 `id, name` 3. 之所以可以实现自动配置,就是因为我们指定了Mapper层对应执行的方法。所以我们在**权限类名**中把对应的路径需要指定正确,不能出错。例如我们要配置客户端列表的权限,则在**权限类名**中填入该列表查询SQL所在的mapper全路径: ![](https://img.kancloud.cn/90/cf/90cfd532a6a8a57421a051c61eda4f5b_2624x1530.png) 4. 还有一点需要注意的是,若分页、列表等方法不是自己写的mapper,而是采用的mybatis-plus提供的方法,没有自定义的方法名,我们需要跟踪下代码,可以看到,自带的page、list等方法,其实是调用了BaseMapper里的方 法。例如追踪下面截图中得mapper层执行得方法 ![](https://img.kancloud.cn/9e/be/9ebee56cd0de7f76e17e71677d185202_1575x523.png) ![](https://img.kancloud.cn/3c/74/3c74a97b188a9ce6f964c1e4e7e93a39_1237x264.png) ![](https://img.kancloud.cn/10/36/1036cdabe21fcc3422a5b71f6a1bfe93_1483x1155.png) 所以我们如果需要配置**权限类名**,只需要在`scope_class`(数据权限类名) 字段中存上`com.wlcb.jpower.dbs.dao.tenant.mapper.selectPage`即可。 5. 当字段**权限类型**等于5(自定义)时,字段**权限值域**数据必须要有值,值输入我们正常sql得where条件后面得部分即可。例如 ``` login_count > 1 and id = '{userId}' and address in ({roleIds}) ``` * 在这个配置的sql里我使用了占位符 {userId} ,没错,这么写在底层就可以直接获取到当前登录用户的 userId字段,除此之外我们还可以用更多的参数,比如 {orgId} 、{roleId} 、{tenantCode} 、 {loginId} 、 {userName} 等等。 * 这些参数可以参考UserInfo类,这个类得所有字段我们都是可以根据占位符来获得的。 ![](https://img.kancloud.cn/c2/34/c234148b2d7e6e7c34ab2021e2d1112d_1221x1152.png) * 需要注意得是如果我们要使用roleIds字段时,我们得自定义sql部分必须是要`in`查询。例如`role_id in {roleIds}` 6. **所有角色都执行**当配置为**是**时,就没有必要再对该条数据权限进行角色权限分配了,因为所有得角色都会执行该条数据权限,这样我们对一些懒人用户省去了很多配置。 7. 那么下面,我们就需要对我们刚才配置得数据权限分配角色了,我们在 `权限管理->角色管理` 中进行角色得权限分配。 ![](https://img.kancloud.cn/0e/06/0e0615ae2165f625a5a8c92fb9ff0054_3058x1248.png) ![](https://img.kancloud.cn/ee/d4/eed4a76cc571a8fb13f51e0c0f5f85f4_3568x1794.png) 点击左侧菜单时,右边会显示我们刚才配置好的数据权限列表,选中我们刚才配置好的数据权限,然后点击“确定“就配置完成了。 8. 配置好之后,启动工程,我们使用刚才赋权的角色调用登录接口获取到token,使用获取到的token再调用我们配置好的数据权限mapper所对应的接口。 可以看到接口只返回了3条数据。 ![](https://img.kancloud.cn/08/7a/087a282008d92a662e09d7f316cc277c_678x500.png) 控制台的打印的sql中的where条件部分也有当前登录用户的过滤条件 ![](https://img.kancloud.cn/81/1b/811b30953278a2a403e9d84f6d10125b_3032x189.png) 下面我们修改下数据权限配置,配置为自定义sql再进行一次测试。 ![](https://img.kancloud.cn/51/a6/51a60161e098f3b8a73a5174b88bd2c6_3007x369.png) 无需重启服务,我们再使用刚才的用户重新调用接口获取新的token,使用新token再次调用我们刚才的接口。 可以看到接口只返回了1条数据。 ![](https://img.kancloud.cn/e2/e9/e2e9939768112ac6550ebc0fd6ddfbdf_689x468.png) 控制台的打印的sql中的where条件部分正好是我们刚才自定义的sql部分 ![](https://img.kancloud.cn/7c/ec/7cecaee840023aff161adf13aa897d37_3071x167.png) ## 注意项 * **超级管理员不受数据权限影响** * **因为我们的数据权限是在指定菜单后进行配置的,那也就是只有这条权限在配置的菜单下执行时才会生效,在其他菜单下执行则不会生效,如果在其他菜单下也需要执行配置的权限,则需要在该菜单下也配置一次这个权限**