OSS配置租户模式,AuthUtil.getTenantId()为空

Blade 未结 2 160
石老记
石老记 剑圣 2025-11-04 16:13

一、该问题的重现步骤是什么?

1.   应用层使用配置minio,yaml文件里配置oss properties

2.  应用层controller,单独接口里调用

Oss ossObject = ossService.getOne(new LambdaQueryWrapper<Oss>().eq(Oss::getOssCode, fileREQ.getCode())); //数据库配置的oss对象
MinioTemplate minioTemplate = (MinioTemplate) ossBuilder.template(ossObject.getTenantId(), ossObject.getOssCode());

          String prefix = .substring(, .lastIndexOf());
          String filepath = prefix + + ;
          String url = .getPresignedObjectUrl(.getBucketName().toLowerCase(), filepath, * );

3. oss jar包里调用的 bladeOssRule里的 Authutil.getTenantId()是空值。其实AuthUtil的getuser也是null

BladeOssRule OssRule {
    Boolean ;

    String (String bucketName) {
        String prefix = .? AuthUtil.().concat() : ;
        prefix + bucketName;
    }

    String (String originalFilename) {
        + DateUtil.() + + StringUtil.() + + FileUtil.(originalFilename);
    }

    (Boolean tenantMode) {
        .= tenantMode;
    }
}


二、你期待的结果是什么?实际看到的又是什么?

前端调用过来的借口,contollr里AuthUtil是能个用户相关信息的。

但是架包里的得不了。我希望也能得到


三、你正在使用的是什么产品,什么版本?在什么操作系统上?

bladex boot 4.5.0.release


四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

2条回答
  • 2025-11-04 16:32

    接口怎么调用的,有没有传递token,AuthUtil是需要能获取到request的请求头才能解析的。

    0 讨论(1)
  • 2025-11-06 10:24

    接口这样调用,前端,url调用接口定义在api下的js文件里

    import request from '@/axios';

    export const getPresignedUrl = (data) => {

    return request({

            url: '/resource/endpoint/get-presigned-url',

            method: 'post',

            data: data

        })

    }


    vue组件里,这样使用api 接口


    async handleFileSubmit(){

    try {

        const reqData = {}

        const res = await getPresignedUrl(reqData);

        if (res.data.code === 200 && res.data.data.length > 0) {

            this.fileUrls = res.data.data;

        }else{

            this.$message.error(res.data.message);

        }

    }

    后端接口代码就干一件事情,调用oss

    R<List<AttachVO>> (FileREQ fileREQ) {
        Oss ossObject = .getOne(LambdaQueryWrapper<Oss>().eq(Oss::getOssCode, fileREQ.getCode()));
    
        MinioTemplate minioTemplate = (MinioTemplate) ossBuilder.template(ossObject.getTenantId(), ossObject.getOssCode());
        List<CompletableFuture<AttachVO>> futures = fileREQ.getAttaches().stream().map(attachFile -> CompletableFuture.(() -> {
            String prefix = .getOriginalName().substring(, .getOriginalName().lastIndexOf());
            String filepath = prefix + + ;
            String url = .getPresignedObjectUrl(.getBucketName().toLowerCase(), filepath, * );
    
            (Func.(url)) {
                AttachVO vo = AttachVO();
                vo.setName(filepath);
                vo.setDomainUrl(.getEndpoint());
                vo.setOriginalName(.getOriginalName());
                vo.setExtension(FileUtil.(.getOriginalName()));
                vo.setAttachSize(.getAttachSize());
                vo.setLink(url);
                vo;
            }
            ;
        })).collect(Collectors.());
    
        List<AttachVO> fileVOList = futures.stream().map(CompletableFuture::join).filter(Objects::).toList();
        R.(fileVOList);
    }


    作者追问:2025-11-06 10:44

    你们做内部改造了么?原版没有这个方法

    CleanShot20251106104355@2x.png


    你去测试下用户管理的头像上传,看看AuthUtil能不能获取到数据

    回答: 2025-11-06 11:07

    get-presigned-url

    是我们自己在controller层的方法。

    你们的 oss 架包

    blade-starter-oss

    image.png


    String (String bucketName, String fileName, Integer expires) {
        .getPresignedObjectUrl(
           GetPresignedObjectUrlArgs.()
              .method(Method.)
              .bucket(getBucketName(bucketName))
              .object(fileName)
              .expiry(expires)
              .build()
        );
    }
    getPresignedObjectUrl 调用的就是这个方法getBucketName(bucketName)


    image.png

    getBucketName(bucketName)里的AuthUtil没有拿到request里的相关信息



    回答: 2025-11-06 11:13

    疑问:是不是在builder.templete没有让里面的内容自装配?

    OssTemplate (String tenantId, String code) {
        Oss oss = getOss(tenantId, code);
    
        OssContext ossContext = OssContext();
        ossContext.setOss(oss);
        ossContext.setOssProperties();
        ossContext.setOssPool();
        ossContext.setTemplatePool();
    
        LiteRuleResponse<OssContext> resp = .execute(, tenantId, ossContext);
        (resp.isSuccess()) {
           OssContext contextBean = resp.getContext();
           contextBean.getOssTemplate();
        } {
           ServiceException();
        }
    }

    这是你们blade-starter-oss,OssBuilder.java的内容。

    看起来只是创建了一个某个oss templete的Bean,并没有AuthUtil自装配也没有调用Context里的,没有看到Set。


    作者追问:2025-11-06 12:09

    你没有列出你们自定义模块的代码,所以无法判断是什么原因。

    你先按照我们要求,用原版源码,在个人中心界面上传一个头像,看看AuthUtil能不能获取到数据。

    如果官方原版的可以,你自己写的方法不行,那就得列出来看你们是怎么写的具体代码才知道原因。

    回答: 2025-11-06 13:26

    1. 没有自定义blade-starter-oss的代码块

    2. 应用层controller里,主动调用ossbuilder.template方法,强制转化为miniotemplate,以便调用getpersinedurl这个方法

      这个代码已经贴上去给你们了

    3. 用的就是你们仓库拉下来的blade-starter-oss 4.5.0.release架包,表现如此。

      所以,没有自定义任何oss代码块

    回答: 2025-11-19 10:46

    后文呢?

    0 讨论(0)
提交回复