一、若依数据权限的使用
若依数据权限是一款基于Spring Boot与Vue.js的开源权限管理系统,其数据权限是指用户在系统中对于数据的访问控制,主要包括菜单权限、按钮权限、数据权限等。其中,数据权限是数个中最为核心也最为复杂的一个。若依数据权限可以在系统中设定数据权限规则,根据用户具有的角色,用于控制用户在系统中能够访问哪些数据。使用若依数据权限可以实现:从后台控制前端页面的显示和功能操作的权限控制,加强系统保密性和机密性;配置数据权限规则,在数据访问量大时减轻服务器的压力等。
二、若依数据权限过滤
若依数据权限过滤是系统在实现数据权限的核心技术。过滤操作是通过Mybatis的插件机制实现,MyBatis将执行SQL请求到数据库时,数据权限过滤器拦截请求,改写SQL语句,并将修改后的SQL语句进行重新查询。具体来说:当用户在前端界面选择查询的数据范围时,若依数据权限系统会将查询条件转换为符合数据权限规则的查询条件,利用查询条件会根据Mybatis的interceptor机制对于查询的数据进行过滤。
三、若依数据权限案例
我们以一个简单的人员管理系统为例,该系统有权限的管理,不同的用户角色看到的列表也有要求的不同。
@Override @DataScope(deptAlias = "d", userAlias = "u") public List selectUserList(SysUser user) { return userMapper.selectUserList(user); }
上述代码中,我们在service接口的实现类中重写了分页查询功能,在方法中添加了@DataScope注解,通过deptAlias设置数据权限部门别名,userAlias设置数据权限用户别名,这样就可以根据不同用户的登录角色控制他们访问的数据不同。
四、若依数据权限如何实现的
若依数据权限实现的主要核心是使用拦截器实现的Mybatis插件机制。简单的实现思路是,在Mybatis执行SQL请求到数据库时,将其拦截,改写SQL语句,增加where条件,将查询根据数据权限的要求进行过滤。
五、若依数据权限实现
若依数据权限的实现是通过Mybatis的拦截器机制实现的。具体操作为:定义一个拦截器,在执行Mybatis中Executor的query方法的时候,使用ParserSQLVisitor解析sql语句,然后获取到AST节点,解析出查询条件后,执行DataScopeInterceptor的interceptor方法。该过程中可以从线程安全的ThreadLocal中获取登录用户信息,并结合自定义注解等实现数据权限拦截。最终将修改过后的SQL语句重新查询,从而实现数据权限的管理。
六、若依数据权限自定义怎么设置
设置若依数据权限,需要先启用数据权限,在数据源中添加配置
## Druid 连接池中添加过滤器 spring.datasource.druid.filter-stat.log-slow-sql=true
然后,我们还需要在若依数据权限的配置文件中添加数据权限配置,如下:
## 数据权限配置 ## 表示自定义数据权限语法构造方法的全限定名,程序通过反射来构造 ifoxconn.data-scope.interceptor-class-name=com.ruoyi.common.datascope.CustomDataScopeInterceptor
七、若依数据权限控制
若依数据权限控制主要有以下实现方式:
1、使用注解设置数据权限
//若数据权限注解 @DataScope(数据权限部门别名 = "dept",数据权限用户别名= "user")
2、使用注解+过滤
@Bean("若依数据权限拦截器") public DataScopeInterceptor dataScopeInterceptor() { return new DataScopeInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { InterceptorRegistration addInterceptor = registry.addInterceptor(若依数据权限拦截器"); // 权限控制 addInterceptor.addPathPatterns("/**"); }
3、全局解析器过滤
@Bean public GlobalConfiguration globalConfiguration() { GlobalConfiguration globalConfiguration = new GlobalConfiguration(); //全局设置 SQL 解析处理链 注意:该配置只对当前初始化的 SqlSessionFactory 生效 globalConfiguration.setSqlParser(new TenantSqlParser()); return globalConfiguration; }
八、若依数据权限分页
若依数据权限分页可以通过PageHelper来实现。我们在查询时添加分页操作,如下:
//设置分页信息 PageHelper.startPage(1, 10); //查询数据 List