OpenScope是一种轻量级、易维护的数据权限的解决方案,它能处理比较复杂的权限操作逻辑。兼容操作权限Shiro等框架。
OpenScope提供了一种基于SQL的智能添加权限范围列的方案,相对原始的数据权限方案,它是轻量级的,它只有一些配置代码,同时它也是提高了代码的可维护性。另外它不需要额外的更改您的程序结构,就能轻松使您的项目支持数据权限操作。
什么是操作权限,什么是数据权限详细见WIKI 简介
其他环境需要自行测试和替换可选依赖部分。
注意依赖使可选项,所以不会主动依赖,建议使用推荐的编译环境的依赖版本号。
<dependency>
<groupId>com.mofum.scope</groupId>
<artifactId>scope-mybatis-boot-starter</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
以下依赖为【可替换】依赖,如果原环境没有,则需要添加,不会主动依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>${spring-boot.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring-boot.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>${cglib.version}</version>
<scope>compile</scope>
</dependency>
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<SysUser> userList(@SSID String deptId) { // @SSID表示这是一个业务对象,可以是带有@Scope注解的对象,也可以是List,也可以是Map,还可以是JSON字符串(对象和数组)
return scopeService.selectList();
}
//这是一个没有开启权限范围的方法
@GetMapping("/user/list2")
public List<SysUser> userList2() {
return scopeService.selectList();
}
}
//内置环境,编码调整数据权限
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()等。
@Bean
public SQLRewriter sqlRewriter(SQLCompatibleProcessor sqlCompatibleProcessor) {
CustomSQLRewriter sqlRewriter = new CustomSQLRewriter();
sqlRewriter.setCompatibleProcessor(sqlCompatibleProcessor);
return sqlRewriter;
}
@Bean
public SQLCompatibleProcessor sqlCompatibleProcessor() {
return new DruidSQLCompatibleProcessor();
}
<name>-<quidn>
<列名/属性名>-<权限>
q:查询权限
u:更新权限
i:插入权限
d:删除权限
n:无权限
@Scope 指定 columnRules属性即可
//意思是id没有权限,将被过滤
@Scope(columnRules="id-n")
@Scope 指定 propertiesRules属性即可
//意思是属性id没有权限,将被过滤
@Scope(columnRules="id-n")
//属性过滤
EnvsRule.addPropertiesRule("prop-n");
//SQL列过滤
EnvsRule.addColumnRule("col-n");
认证器提供对每一组业务ID,权限ID进行单独校验,你只需要在@SSID注解中指定authenticator或者authenticatorClass即可
authenticator : 取全局环境的配置,如果全局没有,存在Spring环境,则取Spring容器的认证器。
authenticatorClass :静态认证器,通过反射新建认证器进行认证
3.0.0 OpenScope 将采用更为简洁的方式来实现数据权限管理,并将运行的环境数据通过Caffeine\Redis\关系数据库等管理起来。
QQ交流群:1062019634(200人)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )