多租户场景下公用文件的访问
默认情况下资源是租户隔离的,但是在某些多租户场景下,如果一个用户希望可以访问当前租户对象之外的文件资源。例如报表。
首先你需要为文件资源设置CODE。之后相关的系统接口通过CODE访问对应的资源。
关于FileLoader接口
当我们通过CODE访问文件资源的时候,BaskServer是通过FileLoader获取对应的文件对象的。
我们可以利用基于SPI技术的FileLoader接口,返回公用租户对象下的文件资源。
package com.basksoft.core.database.service.file;
import com.basksoft.core.database.model.BaskFile;
import com.basksoft.core.security.entity.User;
public interface FileLoader {
public BaskFile getBaskFile(User loginUser, String tenantId, String code);
List<BaskFile> loadDeployedFiles(User loginUser, String tenantId, FileType[] types);
}
参考实现
import com.basksoft.core.database.manager.file.FileManager;
import com.basksoft.core.database.model.BaskFile;
import com.basksoft.core.database.service.file.FileLoader;
import com.basksoft.core.security.entity.User;
public class DefaultFileLoader implements FileLoader {
@Override
public BaskFile getBaskFile(User loginUser, String tenantId, String code) {
BaskFile currentBaskFile = FileManager.ins.loadFile(tenantId, code);
if (currentBaskFile!=null) {
return currentBaskFile;
} else {
//获取基础租户下的文件对象
currentBaskFile = FileManager.ins.loadFile("TENANT_COMMON", code);
}
return currentBaskFile;
}
@Override
public List<BaskFile> loadDeployedFiles(User loginUser, String tenantId, FileType[] types) {
List<BaskFile> fileList = new ArrayList<>();
fileList.add(FileManager.ins.loadDeployedFiles(tenantId,types));
if (!tenantId.equals("TENANT_COMMON")) {
//获取基础租户下已发布的文件树
fileList.add(FileManager.ins.loadDeployedFiles("TENANT_COMMON",types));
}
return fileList;
}
}