您觉得本文档还缺少什么内容?可以自己补充~

  1. 在用户管理页面配置角色的数据权限范围

  2. 全部: 可以查看全部数据

  3. 本级: 可以看到本部门的数据
  4. 本级以及子级: 可以看到本部门和子部门的数据
  5. 自定义: 可以看到自定义部门的数据
  6. 个人: 可以看到自己的数据

  7. 配置数据权限插件

/**
 * 数据权限插件
 *
 * @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;
}
  1. 写查询方法时,需要在 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);
}
  1. 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());
}
  1. 执行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);
    }
}

results matching ""

    No results matching ""