# open-scope **Repository Path**: mofum/open-scope ## Basic Information - **Project Name**: open-scope - **Description**: OpenScope是一种轻量级、易维护的“数据权限”的解决方案,它能处理比较复杂的“数据权限”操作逻辑。兼容Shiro等操作权限框架。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://www.mofum.com - **GVP Project**: No ## Statistics - **Stars**: 276 - **Forks**: 105 - **Created**: 2019-03-28 - **Last Updated**: 2025-06-20 ## Categories & Tags **Categories**: authority-management **Tags**: 数据权限, 鉴权, 通用鉴权 ## README

OPEN-SCOPE v2.0.0

open-scope

## 介绍 OpenScope是一种轻量级、易维护的数据权限的解决方案,它能处理比较复杂的权限操作逻辑。兼容操作权限Shiro等框架。 OpenScope提供了一种基于SQL的智能添加权限范围列的方案,相对原始的数据权限方案,它是轻量级的,它只有一些配置代码,同时它也是提高了代码的可维护性。另外它不需要额外的更改您的程序结构,就能轻松使您的项目支持数据权限操作。 什么是操作权限,什么是数据权限详细见[WIKI 简介](http://) ## 当前版本支持的功能 - 数据权限查询过滤 - 支持注解或代码方式添加范围ID - 兼容其他Mybatis插件 - 支持较细粒度的多范围认证 - 支持数据SQL列过滤 - 支持数据返回结果属性过滤 ## 当前版本处理流程 ### 数据权限查询过滤 - 提取参数中的业务ID(SSID) 记为集合A - 将集合A转换为范围ID(SID) 记为集合B - 将集合B根据各自的范围拼装进SQL处理 ### 数据权限鉴权 - 提取参数中的业务ID(SSID) 记为集合A - 将集合A转换为范围ID(SID) 记为集合B - 校验用户是否拥有集合B的数据权限 ### 数据权限列数据过滤 - 提供对简单SQL列预查询过滤 - 提供对返回结果进行属性进行过滤(Map\List\POJO) ## 涉及技术 ### 编译环境: - JDK:1.8 - SpringBoot:2.4.0(最低支持) ~ 2.7.8(最高支持) - hutool:5.8.12 - druid:1.2.9(最低支持) ~ 1.2.16(最高支持) - mybatis:3.4.5(最低支持) ~ 3.5.11(最高支持) - mybatis-spring-boot:2.1.4(最低支持) ~ 3.0.1(最高支持) 其他环境需要自行测试和替换可选依赖部分。 ### 测试环境: - junit:4.13.2 - h2:2.1.214 ### 简单用法 #### 依赖部分 注意依赖使可选项,所以不会主动依赖,建议使用推荐的编译环境的依赖版本号。 ~~~ com.mofum.scope scope-mybatis-boot-starter 2.0.0.RELEASE ~~~ 以下依赖为【可替换】依赖,如果原环境没有,则需要添加,不会主动依赖。 ~~~ org.springframework.boot spring-boot-starter-web ${spring-boot.version} compile org.springframework.boot spring-boot-starter-aop ${spring-boot.version} compile org.springframework.boot spring-boot-autoconfigure ${spring-boot.version} compile org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis-spring-boot.version} compile com.alibaba druid ${druid.version} compile cglib cglib-nodep ${cglib.version} compile ~~~ #### 代码部分 1. 基础使用 ##### 注解说明: open-scope 提供了丰富的注解,来支持数据操作。 ~~~ @SID //范围ID注解:用于指明具体的列信息,该注解优先级高于@SSID @Schema @SSID //业务ID注解:用于提取业务ID,转换范围ID,认证等操作。注解:该注解优先级高于@Schema @Scope //范围注解:用于指明返回结果的的列,查询结果的列(只有加了@Scope注解时@SSID才会生效) @Schema //表注解:用于指明同一查询中的的表名,表别名. ~~~ 以下是一个简单使用示例 ,具体的使用示例可以看我们配置的 【RuoYi-Vue 示例】:https://gitee.com/mofum/open-scope-demo ~~~ @RestController @Scope //被Scope标记的将会被开启权限范围扫描 @RequestMapping("/scope") public class ScopeController { @Autowired ScopeService scopeService; @GetMapping("/user/list") @Scope //被Scope标记的将会被开启转换器功能 业务ID转范围ID @Schema(value = "sys_user", alias = "u") //被Schema注解标记则会填充当前业务ID没有指定的表信息 @SID("dept_id") //被SID标记则会填充具体的数据列对应关系 public List userList(@SSID String deptId) { // @SSID表示这是一个业务对象,可以是带有@Scope注解的对象,也可以是List,也可以是Map,还可以是JSON字符串(对象和数组) return scopeService.selectList(); } //这是一个没有开启权限范围的方法 @GetMapping("/user/list2") public List userList2() { return scopeService.selectList(); } } ~~~ 2. 编程方式使用 ~~~ //内置环境,编码调整数据权限 Envs.clear();//清空所有的缓存数据。 SID sid = new SID(); sid.setColumn("test"); sid.setValue("2334"); SID sid2 = new SID(); sid2.setColumn("test"); sid2.setValue("2335"); Envs.addSID(sid); Envs.addSID(sid2); //配合SQL重构器来配合其他使用(例如JDBC工具类) DruidSQLRewriter rewriter = new DruidSQLRewriter(); rewriter.getFormatOption().setPrettyFormat(false); rewriter.getFormatOption().setUppCase(false); String newSql = rewriter.rewrite(sql); ~~~ > 注意:Envs是存储了当前的环境变量采用了ThreadLocal,所以当线程不是新创建,而是使用连接池的情况下,请务必手动清除范围ID,具体方法未Envs.clear();Envs.scopeCollections().remove()等。 3. SQL重写器(默认:DruidSQLRewriter) ~~~ @Bean public SQLRewriter sqlRewriter(SQLCompatibleProcessor sqlCompatibleProcessor) { CustomSQLRewriter sqlRewriter = new CustomSQLRewriter(); sqlRewriter.setCompatibleProcessor(sqlCompatibleProcessor); return sqlRewriter; } ~~~ 4. SQL兼容器(QL重写器是:DruidSQLRewriter才会生效) ~~~ @Bean public SQLCompatibleProcessor sqlCompatibleProcessor() { return new DruidSQLCompatibleProcessor(); } ~~~ 5. 关于规则表达式 ~~~ - <列名/属性名>-<权限> q:查询权限 u:更新权限 i:插入权限 d:删除权限 n:无权限 ~~~ 6. 数据结果SQL列过滤 ~~~ @Scope 指定 columnRules属性即可 //意思是id没有权限,将被过滤 @Scope(columnRules="id-n") ~~~ 7. 数据结果属性过滤 ~~~ @Scope 指定 propertiesRules属性即可 //意思是属性id没有权限,将被过滤 @Scope(columnRules="id-n") ~~~ 8. 编程方式使用过滤 ~~~ //属性过滤 EnvsRule.addPropertiesRule("prop-n"); //SQL列过滤 EnvsRule.addColumnRule("col-n"); ~~~ 9. 关于认证器 认证器提供对每一组业务ID,权限ID进行单独校验,你只需要在@SSID注解中指定authenticator或者authenticatorClass即可 ~~~ authenticator : 取全局环境的配置,如果全局没有,存在Spring环境,则取Spring容器的认证器。 authenticatorClass :静态认证器,通过反射新建认证器进行认证 ~~~ #### 关于3.0.0 前瞻 3.0.0 OpenScope 将采用更为简洁的方式来实现数据权限管理,并将运行的环境数据通过Caffeine\Redis\关系数据库等管理起来。 #### 联系我们 QQ交流群:1062019634(200人)