若依数据权限详解

发布时间:2023-05-20

一、若依数据权限的使用

若依数据权限是一款基于Spring Boot与Vue.js的开源权限管理系统,其数据权限是指用户在系统中对于数据的访问控制,主要包括菜单权限、按钮权限、数据权限等。其中,数据权限是数个中最为核心也最为复杂的一个。若依数据权限可以在系统中设定数据权限规则,根据用户具有的角色,用于控制用户在系统中能够访问哪些数据。使用若依数据权限可以实现:从后台控制前端页面的显示和功能操作的权限控制,加强系统保密性和机密性;配置数据权限规则,在数据访问量大时减轻服务器的压力等。

二、若依数据权限过滤

若依数据权限过滤是系统在实现数据权限的核心技术。过滤操作是通过Mybatis的插件机制实现,MyBatis将执行SQL请求到数据库时,数据权限过滤器拦截请求,改写SQL语句,并将修改后的SQL语句进行重新查询。具体来说:当用户在前端界面选择查询的数据范围时,若依数据权限系统会将查询条件转换为符合数据权限规则的查询条件,利用查询条件会根据Mybatis的interceptor机制对于查询的数据进行过滤。

三、若依数据权限案例

我们以一个简单的人员管理系统为例,该系统有权限的管理,不同的用户角色看到的列表也有要求的不同。

@Override
@DataScope(deptAlias = "d", userAlias = "u")
public List<sysuser> 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

然后,我们还需要在若依数据权限的配置文件中添加数据权限配置,如下:

## 数据权限配置
## 表示自定义数据权限语法构造方法的全限定名,程序通过反射来构造
foxconn.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<Table> list = tableMapper.selectList(null);
// 分页对象
PageInfo<Table> pageInfo = new PageInfo<>(list);

九、若依数据权限管理

若依数据权限管理主要通过后台管理界面实现,管理员可以在管理界面进行数据权限的配置和规则的管理。同时,若依数据权限还提供了图形化的权限查看,可对用户在系统中的功能使用进行自定义授权和管理。管理员在后台还可以设置数据权限规则,定义不同部门、不同用户等的访问权限,并针对某些数据设置过滤规则。

十、若依数据权限怎么用

若依数据权限用于数据过滤方面,主要可以在查询数据库的时候使用。在使用 Mybatis 查询时,可以通过@Select注解使用。

@DataScope(deptAlias = "d", userAlias = "u")
@Select("select * from user where name = 'zhangsan'")
User selectUserInfo();

在上述示例中,我们使用@DataScope,定义了数据权限别名,调用selectUserInfo可以实现对于查询结果的过滤。 以上就是若依数据权限的全部内容,可以看到若依数据权限的应用非常广泛,尤其在系统安全性和数据保密性方面有着得天独厚的优势。同时,若依数据权限的实现也不是很复杂,只需要按照一定逻辑进行数据的拦截过滤和SQL语句的改写即可。但是要注意,在数据量较大的情况下,数据过滤的效率问题也需要特别关注。针对这个问题,在后续的开发中,我们可以根据具体情况对引擎进行优化,提高查询效率,进一步提高应用的性能。