阿里云 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 权限控制
前言 最近公司的私有 Oss 服务满了,且 Oss 地址需要设置权限,只有当前系统的登录用户才能访问 Oss 下载地址。一开始想着用 Nginx 做个转发来着,Nginx 每当检测当前请求包含特定的 Oss 地址就转发到我们的统一鉴权接口上去,但是紧…...
CSS详细基础(六)边框样式
本期是CSS基础的最后一篇~ 目录 一.border属性 二.边框属性复合写法 三.CSS修改表格标签 四.内边距属性 五.外边距属性 六.其他杂例 1.盒子元素水平居中 2.清除网页内外元素边距 3.外边距的合并与塌陷 4.padding不会撑大盒子的情况 七.综合案例——新浪导航栏仿真 …...
支持向量机SVM:从数学原理到实际应用
目录 一、引言背景SVM算法的重要性 二、SVM基础线性分类器简介什么是支持向量?超平面和决策边界SVM的目标函数 三、数学背景和优化拉格朗日乘子法(Lagrange Multipliers)KKT条件核技巧(Kernel Trick)双重问题和主问题&…...
【办公自动化】在Excel中按条件筛选数据并存入新的表(文末送书)
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...
第三章:最新版零基础学习 PYTHON 教程(第十一节 - Python 运算符—Python 中的any与all)
Any 和 All 是 python 中提供的两个内置函数,用于连续的与/或。Any如果任何一项为 True,则返回 true。如果为空或全部为 false,则返回 False。Any 可以被认为是对所提供的可迭代对象进行 OR 操作的序列。它会短路执行,即一旦知道结果就停止执行。 句法: any(iterable) 函…...
Pytorch单机多卡分布式训练
Pytorch单机多卡分布式训练 数据并行: DP和DDP 这两个都是pytorch下实现多GPU训练的库,DP是pytorch以前实现的库,现在官方更推荐使用DDP,即使是单机训练也比DP快。 DataParallel(DP) 只支持单进程多线程…...
asp.net coremvc+efcore增删改查
下面是一个使用 EF Core 在 ASP.NET Core MVC 中完成增删改查的示例: 创建一个新的 ASP.NET Core MVC 项目。 安装 EF Core 相关的 NuGet 包。在项目文件 (.csproj) 中添加以下依赖项: <ItemGroup><PackageReference Include"Microsoft…...
Java基础面试,什么是面向对象,谈谈你对面向对象的理解
前言 马上就要找工作了,从今天开始一天准备1~2道面试题,来打基础,就从Java基础开始吧。 什么是面向对象,谈谈你对面向对象的理解? 谈到面向对象,那就不得不谈到面向过程。面向过程更加注重的是完成一个任…...
Ubuntu系统初始设置
更换国内源 安装截图工具 安装中文输入法 安装QQ 参考: 安装双系统win10Ubuntu20.04LTS(详细到我自己都害怕) 引导方式磁盘分区方法UEFIGPTLegancyMBR 安装网络助手 sudo apt install net-tools 安装VS Code 使用从官网下载.deb安装包…...
焕新古文化传承之路,AI为古彝文识别赋能
目录 1 古彝文与古典保护 2 古文识别的挑战 2.1 西文与汉文OCR 2.2 古彝文识别难点 3 合合信息:古彝文保护新思路 3.1 图像矫正 3.2 图像增强 3.3 语义理解 3.4 工程技巧 4 总结 1 古彝文与古典保护 彝文指的是云南、贵州、四川等地的彝族人使用的文字&am…...
毛玻璃动画交互效果
效果展示 页面结构组成 从上述的效果展示页面结构来看,页面布局都是比较简单的,只是元素的动画交互比较麻烦。 第一个动画交互是两个圆相互交错来回运动。第二个动画交互是三角绕着圆进行 360 度旋转。 CSS 知识点 animationanimation-delay绝对定位…...
Audio2Face的工作原理
预加载一个3D数字人物模型(Digital Mark),该模型可以通过音频驱动进行面部动画。 用户上传音频文件作为输入。 将音频输入馈送到预训练的深度神经网络中。 Audio2Face加载预制的3d人头mesh 3D数字人物面部模型由大量顶点组成,每个顶点都有xyz坐标。 深度神经网络输入音频特征,…...
【面试题】2023前端面试真题之JS篇
前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 表妹一键制作自己的五星红旗国庆头像,超好看 世界上只有一种真正的英雄主义,那就是看清生活的真相之后,依然热爱生活。…...
Mysql 分布式序列算法
接上文 Mysql分库分表 1.分布式序列简介 在分布式系统下,怎么保证ID的生成满足以上需求? ShardingJDBC支持以上两种算法自动生成ID。这里,使用ShardingJDBC让主键ID以雪花算法进行生成,首先配置数据库,因为默认的注…...
Windows/Linux双系统卸载Ubuntu
参考:双系统下完全卸载ubuntu...
asp.net core mvc 视图组件viewComponents
ASP.NET Core MVC 视图组件(View Components)是一种可重用的 UI 组件,用于在视图中呈现某些特定的功能块,例如导航菜单、侧边栏、用户信息等。视图组件提供了一种将视图逻辑与控制器解耦的方式,使视图能够更加灵活、可…...
如何保持终身学习
文章目录 2.1. 了解你的大脑2.2 学习是对神经元网络的塑造2.3 大脑的一生 3.学习的心里基础3.1 固定思维与成长思维3.2 我们为什么要学习 4. 学习路径4.1 构建知识模块4.2 大脑是如何使用注意力的4.3 提高专注力4.4 放松一下,学的更好4.5 巩固你的学习痕迹4.6 被动学…...
【RV1103】RTL8723bs (SD卡形状模块)驱动开发
文章目录 前言硬件分析Luckfox Pico的SD卡接口硬件原理图LicheePi zero WiFiBT模块总结 正文Kernel WiFi驱动支持Kernel 设备树支持修改一:修改二: SDK全局配置支持 wifi全局编译脚本支持编译逻辑拷贝rtl8723bs的固件到文件系统的固定目录里面去 上电后手…...
LeetCode 周赛上分之旅 #49 再探内向基环树
⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…...
kubernetes-v1.23.3 部署 kafka_2.12-2.3.0
文章目录 [toc]构建 debian 基础镜像部署 zookeeper配置 namespace配置 gfs 的 endpoints配置 pv 和 pvc配置 configmap配置 service配置 statefulset 部署 kafka配置 configmap配置 service配置 statefulset 这里采用的部署方式如下: 使用自定义的 debian 镜像作为…...
位置编码器
目录 1、位置编码器的作用 2、代码演示 (1)、使用unsqueeze扩展维度 (2)、使用squeeze降维 (3)、显示张量维度 (4)、随机失活张量中的数值 3、定义位置编码器类,我…...
Lua多脚本执行
--全局变量 a 1 b "123"for i 1,2 doc "Holens" endprint(c) print("*************************************1")--本地变量(局部变量) for i 1,2 dolocal d "Holens2"print(d) end print(d)function F1( ..…...
Spirng Cloud Alibaba Nacos注册中心的使用 (环境隔离、服务分级存储模型、权重配置、临时实例与持久实例)
文章目录 一、环境隔离1. Namespace(命名空间):2. Group(分组):3. Services(服务):4. DataId(数据ID):5. 实战演示:5.1 默…...
26663-2011 大型液压安全联轴器 课堂随笔
声明 本文是学习GB-T 26663-2011 大型液压安全联轴器. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了大型液压安全联轴器的分类、技术要求、试验方法及检验规则等。 本标准适用于联接两同轴线的传动轴系,可起到限制…...
ChatGPT架构师:语言大模型的多模态能力、幻觉与研究经验
来源 | The Robot Brains Podcast OneFlow编译 翻译|宛子琳、杨婷 9月26日,OpenAI宣布ChatGPT新增了图片识别和语音能力,使得ChatGPT不仅可以进行文字交流,还可以给它展示图片并进行互动,这是一次ChatGPT向多模态进化的…...
二、VXLAN BGP EVPN基本原理
VXLAN BGP EVPN基本原理 1、BGP EVPN2、BGP EVPN路由2.1、Type2路由——MAC/IP路由2.2、Type3路由——Inclusive Multicast路由2.3、Type5路由——Inclusive Multicast路由 ————————————————————————————————————————————————…...
Evil.js
Evil.js install npm i lodash-utils什么?黑心996公司要让你体统跑路了? 想在离开前给你们的项目留点小礼物? 偷偷地把本项目引入你们的项目吧,你们的项目会有但不仅限于如下的神奇效果: 仅在周日时: 当…...
使用sqlmap的 ua注入
文章目录 1.使用sqlmap自带UA头的检测2.使用sqlmap随机提供的UA头3.使用自己写的UA头4.调整level检测 测试环境:bWAPP SQL Injection - Stored (User-Agent) 1.使用sqlmap自带UA头的检测 python sqlmap.py -u http://127.0.0.1:9004/sqli_17.php --cookie“BEEFHOO…...
华为云云耀云服务器L实例评测 | 实例评测使用之体验评测:华为云云耀云服务器管理、控制、访问评测
华为云云耀云服务器L实例评测 | 实例评测使用之体验评测:华为云云耀云服务器管理、控制、访问评测 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云云耀…...
resultmap
自定义映射resultMap resultMap处理字段和属性的映射关系 若字段名和实体类中的属性名称不一致,则可以通过resultMap设置自定义映射 建moudel项目【实现多对一、一对多的表操作demo】 temp员工表、dept部门表 导入依赖【mysql驱动、junit、mybatis、日志依赖log4…...
wordpress卢松松2019/关键词提取工具
安转插件:案例格式化HTML代码,需要安装插件,具体安装步骤如下: 1、打开菜单->首选项->插件控制,输入 install package 2、等待程序进入插件管理功能,再输入插件名称:TAG 3、点击安装插件。…...
做婚恋网站代理商挣钱吗/信息推广
When he heard the bomb whistling down,Gaer chucked himself down on the floor with his hands over his head.盖尔听到炸弹呼啸落地的声音,立即用双手抱住头趴在地上。The bare concrete floor was cold on my feet.光秃秃的水泥地板使我两脚发冷。There werent enough cha…...
营销型企业网站建设 广义的空间/seo短视频发布页
本文章为作者渗透测试自学系列文章,所有内容仅作为个人学习实验使用,请勿用于实战环境。 文章目录 搭建vulhub环境开启heartbleed容器探测漏洞漏洞复现受影响的版本附容器基本操作搭建vulhub环境 参见https://blog.csdn.net/weixin_42172261/article/details/119004158 开启h…...
广州网站 制作信科便宜/百度助手app下载安装
1 GitHub与code.csdn.net Git这个项目管理软件如今是如日中天,特别是在GitHub等公共免费git项目服务器的大力支持下,无论是开源还是私有项目越来越多地采用git进行项目管理了。GitHub是全球最稳定安全的项目托管平台,但是对国人来说有以下几点…...
wordpress主题在线汉化插件下载/今日军事新闻头条新闻
待续转载于:https://www.cnblogs.com/abdw/p/7264402.html...
网站建设的cms系统/seo工作流程图
PowerBI 十一月的更新终于有了一个解决密集恐惧症患者的方法,建模视图每个tab专注于一个领域,更加简洁。 ps: Microstrategy早就有了。 转载于:https://www.cnblogs.com/lizardbi/p/DAX-PATTERN-POWERBI-ModellingView.html...