智能云端素材库后端-团队空间

创建团队空间

和创建私人空间类似,补充团队空间类型和相关校验即可。

空间成员管理

增删改查

空间权限控制

权限定义

使用JSON定义权限。

创建相应数据模型和根据JSON配置文件获得权限的服务。

使用Sa-Token

引入Sa-Token

导入相应依赖。

Sa-Token默认将数据保存在内存,有数据丢失的风险。可以将其与Redis整合。

基本用法

可以使用StpUtil来进行登录、记录和查询会话信息、查询登录状态等。

还可以使用注解进行鉴权:

1
2
3
4
5
6
// 登录校验:只有登录之后才能进入该方法 
@SaCheckLogin
@RequestMapping("info")
public String info() {
return "查询用户信息";
}

空间账号体系

可以使用kit模式实现多账号认证,将空间鉴权与用户和管理员两种角色鉴权分开。

权限认证逻辑

目前请求参数会较为复杂,首先创建上下文类统一请求中的参数。

在获取上下文时,可以根据请求路径来区分id类型。

这里注意,HttpServletRequest 的 body 值是流,读完后就消失。因此需要在config包下自定义请求包装类和请求包装类过滤器。

之后编写权限校验逻辑即可。

权限认证注解

新建Sa-Token配置类,开启注解鉴权和注解合并:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {

// 注册 Sa-Token 拦截器,打开注解式鉴权功能
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册 Sa-Token 拦截器,打开注解式鉴权功能
registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
}

@PostConstruct
public void rewriteSaStrategy() {
// 重写Sa-Token的注解处理器,增加注解合并功能
SaAnnotationStrategy.instance.getAnnotation = (element, annotationClass) -> {
return AnnotatedElementUtils.getMergedAnnotation(element, annotationClass);
};
}
}

新建空间账号体系鉴权注解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
* 空间权限认证:必须具有指定权限才能进入该方法
* <p> 可标注在函数、类上(效果等同于标注在此类的所有方法上)
*/
@SaCheckPermission(type = StpKit.SPACE_TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface SaSpaceCheckPermission {

/**
* 需要校验的权限码
*
* @return 需要校验的权限码
*/
@AliasFor(annotation = SaCheckPermission.class)
String[] value() default {};

/**
* 验证模式:AND | OR,默认AND
*
* @return 验证模式
*/
@AliasFor(annotation = SaCheckPermission.class)
SaMode mode() default SaMode.AND;

/**
* 在权限校验不通过时的次要选择,两者只要其一校验成功即可通过校验
*
* <p>
* 例1:@SaCheckPermission(value="user-add", orRole="admin"),
* 代表本次请求只要具有 user-add权限 或 admin角色 其一即可通过校验。
* </p>
*
* <p>
* 例2: orRole = {"admin", "manager", "staff"},具有三个角色其一即可。 <br>
* 例3: orRole = {"admin, manager, staff"},必须三个角色同时具备。
* </p>
*
* @return /
*/
@AliasFor(annotation = SaCheckPermission.class)
String[] orRole() default {};

}

使用权限注解

在接口上加上相应权限的注解。

对于某些不需要登录就可以使用的接口,需要编程式鉴权。

全局异常处理

将框架的异常处理为自定义的业务异常。

补充获取权限接口

添加返回给前端权限信息的接口。

空间数据管理

使用ShardingSphere进行分库分表

静态分表

直接引入相关配置即可。

动态分表

需要自定义实现动态分表算法。

配置数据库,分表规则和分表算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
spring:
# 空间图片分表
shardingsphere:
datasource:
names: yu_picture
yu_picture:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/yu_picture
username: root
password: 123456
rules:
sharding:
tables:
picture:
actual-data-nodes: yu_picture.picture # 动态分表
table-strategy:
standard:
sharding-column: spaceId
sharding-algorithm-name: picture_sharding_algorithm # 使用自定义分片算法
sharding-algorithms:
picture_sharding_algorithm:
type: CLASS_BASED
props:
strategy: standard
algorithmClassName: com.yupi.yupicturebackend.manager.sharding.PictureShardingAlgorithm
props:
sql-show: true

在实现分表算法后,还需要自行配置分表管理器,并更新到actural-data-nodes配置中。

之后,可以使用拼接SQL的方式创建分表。