阿里云 Oss 权限控制

这篇具有很好参考价值的文章主要介绍了阿里云 Oss 权限控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近公司的私有 Oss 服务满了,且 Oss 地址需要设置权限,只有当前系统的登录用户才能访问 Oss 下载地址。一开始想着用 Nginx 做个转发来着,Nginx 每当检测当前请求包含特定的 Oss 地址就转发到我们的统一鉴权接口上去,但是紧接着又细想了一下,转发后的地址被恶意分享出去了,不也还是存在文件泄露的风险吗?于是又去翻阅了一下阿里云的 Oss 权限相关的文档。借此整合一些常用的方法,机械代码自留也是分享给大家

完整代码

里面整合了文件的增、删、修改权限、获取签名等方法,各位替换成各自的 ak、sk 即可

package com.queyi.qykgjx.util;

import com.aliyun.oss.*;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.*;
import org.apache.http.ParseException;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class OssUtilCsdn {
    private final static String ENDPOINT = "端点";
    private final static String ACCESS_KEY_ID = "ak";
    private final static String ACCESS_KEY_SECRET = "sk";
    private final static String BUCKET_NAME = "容器名";
    private static String HTTPS_URL_PREFIX = ENDPOINT.replace("https://", ("https://" + BUCKET_NAME + "."));
    private final static String FILE_CATALOG = "文件上传目录";
    
    public static void cpoy(String sourceKey, String dstKey, Boolean deleteSourceFile) {
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        CopyObjectRequest copyObjectRequest = new CopyObjectRequest(BUCKET_NAME, sourceKey, BUCKET_NAME, dstKey);
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setObjectAcl(CannedAccessControlList.Private);
        copyObjectRequest.setNewObjectMetadata(objectMetadata);
        ossClient.copyObject(copyObjectRequest);
        //删除被拷贝的文件
        if (deleteSourceFile) ossClient.deleteObject(BUCKET_NAME, sourceKey);
        ossClient.shutdown();
    }

    public static void setAcl(String bucketName, String url, Boolean privateAcl) {
        ClientBuilderConfiguration config = new ClientBuilderConfiguration();
        config.setSupportCname(false);
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        try {
            ossClient.setObjectAcl(bucketName == null ? BUCKET_NAME : bucketName,
                    getObjectNameByFullUrl(url),
                    privateAcl ? CannedAccessControlList.Private : CannedAccessControlList.PublicRead);
        } catch (OSSException oe) {
            oe.printStackTrace();
        } catch (ClientException ce) {
            ce.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    /**
     * @param bucketName 容器名称
     * @param file       待上传的文件
     * @param acl        文件权限
     */
    public static String upload(String bucketName, MultipartFile file, String acl) throws IOException {
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        if (null == bucketName || bucketName.length() > 0) bucketName = BUCKET_NAME;
        InputStream inputStream = file.getInputStream();
        String filename = file.getOriginalFilename();
        String[] split = filename.split("\\.");
        filename = new Date().getTime() + "." + split[split.length - 1];
        String s = FILE_CATALOG + "/" + filename.replaceAll("/", "");
        PutObjectRequest o = new PutObjectRequest(bucketName, s, inputStream);
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
        if ("private".equals(acl)) metadata.setObjectAcl(CannedAccessControlList.Private);
        else if ("public".equals(acl)) metadata.setObjectAcl(CannedAccessControlList.PublicRead);
        else metadata.setObjectAcl(CannedAccessControlList.Private);
        o.setMetadata(metadata);
        ossClient.putObject(o);
        ossClient.shutdown();
        inputStream.close();
        return HTTPS_URL_PREFIX + "/" + s;
    }

    /**
     * 获取签名
     */
    public static String getSign(String key, int timeOut) throws ParseException {
        ClientBuilderConfiguration config = new ClientBuilderConfiguration();
        config.setSupportCname(false);
        Date expiration = new Date(new Date().getTime() + timeOut * 1000L);
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET, config);
        URL url = ossClient.generatePresignedUrl(BUCKET_NAME, key, expiration);
        return url.toString().split("\\?")[1];
    }

    public static String getAclPath(String url, int timeOut) throws ParseException {
        ClientBuilderConfiguration config = new ClientBuilderConfiguration();
        config.setSupportCname(false);
        Date expiration = new Date(new Date().getTime() + timeOut * 1000L);
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET, config);
        return ossClient.generatePresignedUrl(BUCKET_NAME, getObjectNameByFullUrl(url), expiration).toString();
    }

    public static String getObjectNameByFullUrl(String url) {
        if (!url.contains(FILE_CATALOG)) return null;
        /**
         * a/a.pdf
         */
        return FILE_CATALOG + url.split(FILE_CATALOG)[1];
    }

    /**
     * 删
     */
    public static List<String> deleteObject(String bucketName, List<String> keys) {
        ArrayList<String> newKeys = new ArrayList<>();
        keys.stream().forEach(key -> {
            newKeys.add(key.replace(HTTPS_URL_PREFIX + "/", ""));
        });
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        DeleteObjectsResult deleteObjectsResult = ossClient
                .deleteObjects(new DeleteObjectsRequest(bucketName == null ? BUCKET_NAME : bucketName)
                        .withKeys(newKeys));
        List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
        ossClient.shutdown();
        return deletedObjects;
    }

}

整合接口

 @PostMapping("csdnUpFile")
    public Result csdnUpFile(@RequestParam("file") MultipartFile multipartFile
            , @RequestParam("acl") String perm) throws IOException {
        HashMap<String, String> map = new HashMap<>();
        map.put("fileName", multipartFile.getOriginalFilename());
        map.put("fileUrl", OssUtil.zzhUpload(null, multipartFile, perm));
        return Result.success(map);
    }
    @PostMapping("csdnSetAcl")
    public Result csdnSetAcl(@RequestParam("filePath") String filePath) throws IOException {
        OssUtil.setAcl(null, filePath, true);
        return Result.success("ok");
    }
    @PostMapping("csdnGetAclPath")
    public Result csdnGetAclPath(@RequestParam("filePath") String url) throws IOException {
        return Result.success(OssUtil.getAclPath(url, 60));
    }

    @PostMapping("csdnDeleteFile")
    public Result csdnDeleteDile(@RequestBody List<String> urls) throws IOException {
        return Result.success(OssUtil.deleteObject(null, urls));
    }

测试

上传文件设置成公共读
阿里云 Oss 权限控制,整合,阿里云,云计算,oss权限,java
文件正常访问

阿里云 Oss 权限控制,整合,阿里云,云计算,oss权限,java
将全路径地址作为参数掉修改权限接口

阿里云 Oss 权限控制,整合,阿里云,云计算,oss权限,java
再次访问此地址提示无权限

阿里云 Oss 权限控制,整合,阿里云,云计算,oss权限,java

加上签名访问文件可以正常访问阿里云 Oss 权限控制,整合,阿里云,云计算,oss权限,java

其他方法不做一一测试了,删除文件也是传上传接口返回的全路径即可,可直接删除文件。其他操作看下阿里的Oss 文档即可,机械代码不做过多描述

阿里云 Oss 权限控制,整合,阿里云,云计算,oss权限,java文章来源地址https://www.toymoban.com/news/detail-730798.html

到了这里,关于阿里云 Oss 权限控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【案例实战】SpringBoot整合阿里云文件上传OSS

    1.需求背景 C端业务用户头像上传 海量图片音频、视频存储 用户行为日志存储 (1)阿里云OSS介绍 对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。其数据设计持久性不低于99.9999999999%(12个9),服务设计可用性不低于99.995%。 OSS具

    2024年02月06日
    浏览(56)
  • SpringBoot整合阿里云OSS文件存储解决方案

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:SpringBoot实战 以下是专栏部分内容,更多内容请前往专栏查看! 标题 一文带你学会使用SpringBoot+Avue实现短信通知功能

    2024年02月08日
    浏览(39)
  • 尚医通-阿里云oss-认证接口开发-前端整合(三十二)

    目录: (1)前台用户系统-阿里云OSS介绍 (2)阿里云oss代码入门案例 (3)上传文件到阿里云oss-接口开发 (4)用户认证-接口开发 (5)用户认证-前端整合 (1)前台用户系统-阿里云OSS介绍 扫码登录后显示用户的昵称,点击下面会显示一些下拉列表,下面完成这些功能  实

    2024年01月17日
    浏览(52)
  • LINUX学习------阿里云云计算OSS

    什么是对象存储OSS 阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。 OSS具有与平台无关的RESTful API接口,您可以在任何应用、

    2024年02月05日
    浏览(46)
  • java 使用 阿里云OSS云存储

    分布式文件存储,浏览器上传的文件,统一存储到一个服务器 本文选择统一存储到云存储 先贴计费,很便宜 原文:https://www.aliyun.com/price/product?spm=5176.8465980.help.3.4e701450R42spo#/oss/detail/ossbag aliyun官网 - 产品 - oss对象存储 开通 如果未实名认证,需要认证一下,支付宝认证,约一

    2024年02月05日
    浏览(35)
  • Java实现阿里云OSS简单上传详解

    (1)找到对象存储OSS (2)进入控制台 (3)创建Bucket(都默认即可) (4)获取accessKeyId和accessKeySecret

    2024年02月11日
    浏览(35)
  • JAVA通过阿里云OSS存储实现图片上传功能

    首先我们需要在阿里云注册账号,实名认证后开通OSS功能,点击进入OSS功能的管理平台 进入概览页面后,点击Bucket列表,创建一个Bucket(相当于一个存放文件的文件夹)  关键是要获得下面几个关键的信息,只有拥有这些信息才能连接上这个Bucket进行操作: 添加对应依赖  

    2024年02月05日
    浏览(46)
  • java使用阿里云OSS实现文件上传到云盘

    一、进入阿里云官网的OSS管理控制台并注册账号 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 欢迎登录阿里云,全球领先的云计算及人工智能科技公司,阿里云为200多个国家和地区的企业、开发者和政府机构提供云计算基础服务及解决方案。阿里云云计算、安

    2024年01月17日
    浏览(56)
  • 阿里云Oss服务开通 #对象存储 #OSS

    1.点击立即开通 2.勾上协议,立即开通 3.成功,点击‘管理控制台’ 4.创建Bucket 5.勾选相关参数 6.勾选完的参数 7.进入Bucket 8.上传文件-测试 9.选择上传的文件 10.在主页面看到效果,点击详情查看 阿里云OSS服务API使用 常用入口:Access-Key 勾选 1. 访问控制(RAM) 创建用户**** 2. 短

    2024年01月25日
    浏览(64)
  • SpringBoot整合OSS文件上传

    1、登录阿里云账号 2、创建一个bucket 3、创建子用户 对自用户分配权限,打开操作OSS的全部权限(也可根据业务需求进行更改) 4、配置上传跨域规则 任何来源: * 允许方法: POST 任何请求头Headers: * 每个OSS的用户都会用到上传服务。Web端常见的上传方法是用户在浏览器或App端上

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包