您觉得本文档还缺少什么内容?可以自己补充~
在用户管理页面配置角色的数据权限范围
全部: 可以查看全部数据
- 本级: 可以看到本部门的数据
- 本级以及子级: 可以看到本部门和子部门的数据
- 自定义: 可以看到自定义部门的数据
个人: 可以看到自己的数据
配置数据权限插件
/**
* 数据权限插件
*
* @return 数据权限插件
*/
@Override
protected List<InnerInterceptor> getPaginationBeforeInnerInterceptor() {
List<InnerInterceptor> list = new ArrayList<>();
Boolean isDataScope = databaseProperties.getIsDataScope();
if (isDataScope) {
list.add(new DataScopeInnerInterceptor(userId -> SpringUtils.getBean(UserService.class).getDataScopeById(userId)));
}
return list;
}
- 写查询方法时,需要在 Mapper 的方法中,加入 DataScope dataScope 参数
@Repository
public interface StationMapper extends SuperMapper<Station> {
/**
* 分页查询岗位信息(含角色)
*
* @param page 分页
* @param queryWrapper 参数包装器
* @param dataScope 数据权限
* @return 分页数据
*/
IPage<Station> findStationPage(IPage<Station> page, @Param(Constants.WRAPPER) Wrapper<Station> queryWrapper, DataScope dataScope);
}
- ServiceImpl 层调用:
public IPage<Station> findStationPage(IPage<Station> page, PageParams<StationPageQuery> params) {
StationPageQuery data = params.getModel();
Station station = BeanUtil.toBean(data, Station.class);
LbqWrapper<Station> wrapper = Wraps.lbq(station);
// 可以直接传递 new DataScope() ,也能手动给 DataScope 参数传递一些固定值
return baseMapper.findStationPage(page, wrapper, new DataScope());
}
- 执行baseMapper.findStationPage方法时,会被DataScopeInnerInterceptor插件拦截,该插件会根据当前用户拥有角色的
数据权限
动态拼接sql
public class DataScopeInnerInterceptor implements InnerInterceptor {
@Override
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
// 省略
//查全部
if (DataScopeType.ALL.eq(dsType)) {
return;
}
//查个人
if (DataScopeType.SELF.eq(dsType)) {
originalSql = "select * from (" + originalSql + ") temp_data_scope where temp_data_scope." + selfScopeName + " = " + userId;
}
//查其他
else if (StrUtil.isNotBlank(scopeName) && CollUtil.isNotEmpty(orgIds)) {
String join = CollectionUtil.join(orgIds, ",");
originalSql = "select * from (" + originalSql + ") temp_data_scope where temp_data_scope." + scopeName + " in (" + join + ")";
}
PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);
mpBoundSql.sql(originalSql);
}
}