以RuoYi-Vue为例介绍Spring AOP(面向切面编程)

目录

一、数据权限展示

二、数据权限作用及操作

三、数据权限后端代码分析

controller层

Service层

Mapper层

四、AOP 类DataScopeAspect 处理注解@DataScope


本文以RuoYi-Vue的数据权限控制功能为例,介绍Spring AOP(Aspect Oriented Programming 面向切面编程)部分内容。

一、数据权限展示

如下图所示,进入分配数据权限页面。

在该界面,可以为角色添加不同的数据权限,实现数据管理。

二、数据权限作用及操作

使用数据权限,我们可以让具有不同权限的用户看到的数据有差别,我们进行如下操作来对比说明。

  • 用户admin 的角色为超级管理员,超级管理员设置为具有访问全部数据权限
  • 用户ry 的角色为普通角色,普通角色设置为只有访问本部门数据权限,其所属部门为测试部门

分别使用超级管理员账号admin及普通用户ry登录查看二者可以看到的数据有何区别。

三、数据权限后端代码分析

controller层

因为是用户数据权限控制,所以我们找到SysUserController.java

这段代码在接收到 HTTP GET 请求 /list 时,首先检查当前用户是否具有执行system:users:list 的权限,然后执行用户列表的查询操作,并将查询结果封装成 TableDataInfo 对象返回。

Service层

SysUserServiceImpl.java

Mapper层

SysUserMapper.java

${params.dataScope}对数据范围进行过滤。

四、AOP DataScopeAspect 处理注解@DataScope

@DataScope注解

最后是AOP 类DataScopeAspect 处理注解@DataScope 

根据当前登录用户的信息,判断是否为超级管理员,如果不是,则调用dataScopeFilter方法进行数据权限过滤。这种机制通常用于确保只有非管理员用户才会受到数据权限的约束,管理员用户可以访问所有数据。 

接下来是AOP 类DataScopeAspect 对于全部权限、自定义权限、本部门及以下权限、仅本人权限最终添加的SQL 语句及作用

此切面在目标方法执行前会拦截,检查用户的角色和数据权限配置,然后根据不同的权限类型生成相应的SQL条件。

Ruoyi-Vue 是一个基于 Spring Boot 和 Vue.js 的前后端分离式开发平台,支持多数据源配置。而 TDengine 是一个高性能、高可靠、分布式的时序数据库。下面是整合 TDengine 多数据源的步骤: 1. 在 pom.xml 文件中引入 TDengine 的 JDBC 驱动包。 ```xml <dependency> <groupId>com.taosdata.jdbc</groupId> <artifactId>taos-jdbc</artifactId> <version>1.1.24</version> </dependency> ``` 2. 在 application.yml 文件中配置 TDengine 数据源信息。 ```yaml spring: datasource: primary: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/ruoyi?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: root taos: driver-class-name: com.taosdata.jdbc.TSDBDriver url: jdbc:TAOS://localhost:6030/db_name?user=user_name&password=password ``` 其中 `primary` 是默认的 MySQL 数据源,`taos` 是配置的 TDengine 数据源。 3. 在 MybatisPlusConfig.java 文件中配置多数据源。 ```java @Configuration @MapperScan(basePackages = {"com.ruoyi.project.**.mapper"}) public class MybatisPlusConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.taos") public DataSource taosDataSource() { return DataSourceBuilder.create().build(); } @Bean @Primary public DynamicDataSource dataSource(DataSource primaryDataSource, DataSource taosDataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceType.PRIMARY.name(), primaryDataSource); targetDataSources.put(DataSourceType.TAOS.name(), taosDataSource); return new DynamicDataSource(primaryDataSource, targetDataSources); } } ``` 这里使用了动态数据源,通过 `DataSourceType` 枚举类来区分数据源类型。 4. 在 DynamicDataSource.java 文件中实现动态数据源。 ```java public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>(); public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) { super.setDefaultTargetDataSource(defaultTargetDataSource); super.setTargetDataSources(targetDataSources); super.afterPropertiesSet(); } @Override protected Object determineCurrentLookupKey() { return CONTEXT_HOLDER.get(); } public static void setDataSource(String dataSourceType) { CONTEXT_HOLDER.set(dataSourceType); } public static void clearDataSource() { CONTEXT_HOLDER.remove(); } } ``` 这里使用了 ThreadLocal 来保存当前使用的数据源类型。 5. 在 DataSourceAspect.java 文件中实现切面拦截。 ```java @Aspect @Component public class DataSourceAspect { @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)") public void dataSourcePointCut() { } @Around("dataSourcePointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { MethodSignature signature = (MethodSignature) point.getSignature(); DataSource dataSource = signature.getMethod().getAnnotation(DataSource.class); if (dataSource != null) { DynamicDataSource.setDataSource(dataSource.value().name()); } try { return point.proceed(); } finally { DynamicDataSource.clearDataSource(); } } } ``` 这里使用了 AOP 切面拦截,通过注解 `@DataSource` 来指定使用的数据源类型。 6. 在需要使用 TDengine 数据源的方法上加上 `@DataSource(DataSourceType.TAOS)` 注解。 ```java @DataSource(DataSourceType.TAOS) public List<Map<String, Object>> listFromTDengine() { return jdbcTemplate.queryForList("select * from table_name"); } ``` 这样就可以在 Ruoyi-Vue 中实现 TDengine 多数据源的配置了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值