偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

vivo 企業(yè)云盤服務(wù)端實(shí)現(xiàn)簡介

存儲
本文將介紹企業(yè)云盤的基本功能以及服務(wù)端實(shí)現(xiàn)。

一、背景

vivo 企業(yè)云盤是一個企業(yè)級文件數(shù)據(jù)管理服務(wù),解決辦公數(shù)據(jù)的存儲、共享、審計等文件管理需求;同時便于團(tuán)隊成員快速共享、管理文件,幫助集中管理企業(yè)數(shù)字資產(chǎn),提升辦公效率,實(shí)現(xiàn)內(nèi)部數(shù)據(jù)資源的共享以及與外部客戶之間的文件安全交換。

二、功能介紹

目前 vivo 企業(yè)云盤有 3 個空間:個人空間,團(tuán)隊空間和備份空間。

2.1 個人空間

個人空間用于存儲用戶個人的文件數(shù)據(jù),其他用戶不可見;容量默認(rèn)為 100GB。個人空間支持文件的分享、下載、移動、重命名、星標(biāo)、機(jī)房下載和刪除操作,如下圖所示:

圖片

圖片

圖片


2.2 團(tuán)隊空間

團(tuán)隊空間用于多人協(xié)作,團(tuán)隊中可容納多名成員,每個成員都可以向團(tuán)隊空間中上傳文件并與其他人共享這些文件,也可以下載其他人上傳到該團(tuán)隊空間的文件;團(tuán)隊空間沒有容量限制。

用戶可以在如下位置創(chuàng)建團(tuán)隊空間:

圖片

團(tuán)隊空間的創(chuàng)建者默認(rèn)為該空間的管理員,管理員可以在左邊菜單欄中的團(tuán)隊空間下看到“團(tuán)隊設(shè)置”和“成員管理”,在“團(tuán)隊設(shè)置”頁可以修改該團(tuán)隊空間的名稱和團(tuán)隊描述信息:

圖片

在“成員管理”頁可以添加成員并修改已有成員的權(quán)限:

圖片

2.3 合作伙伴

團(tuán)隊空間中除了內(nèi)部員工還可以加入外部合作伙伴,管理員可在如下頁面申請合作伙伴賬號:

圖片

點(diǎn)擊“新增”后在彈出的“申請外部用戶賬號”頁填寫合作伙伴相關(guān)信息即可提交直接上級領(lǐng)導(dǎo)審批,審批通過后會在該團(tuán)隊空間中生成一個合作伙伴賬號,賬號及初始密碼會以郵件形式發(fā)送到合作伙伴郵箱,合作伙伴登錄后即可上傳文件或下載分享給他的文件。

出于數(shù)據(jù)安全的考慮,合作伙伴無法看到團(tuán)隊空間中內(nèi)部員工上傳的文件,只能看到自己上傳的文件以及分享給他的文件。

管理員可以在”成員管理“頁禁用合作伙伴賬號:

圖片

2.4 備份空間

備份空間用于備份用戶本地電腦上的文件。目前企業(yè)云盤網(wǎng)頁端只能查看已有的備份策略,新建備份策略需要在企業(yè)云盤客戶端進(jìn)行;用戶可以在企業(yè)云盤網(wǎng)頁端右上角的“客戶端下載”下載企業(yè)云盤客戶端:

圖片

在客戶端的“備份同步”頁點(diǎn)擊“新增備份”,然后在彈出的對話框中選擇想要備份的本地文件夾即可創(chuàng)建備份記錄:

圖片

企業(yè)云盤客戶端將按用戶設(shè)置的頻率將指定文件夾下的文件上傳到對象存儲以實(shí)現(xiàn)文件備份;對于實(shí)時備份,企業(yè)云盤客戶端會每 3 分鐘掃描一次本地文件夾,并與遠(yuǎn)程的文件進(jìn)行對比,將新增的文件上傳到對象存儲。

三、功能實(shí)現(xiàn)

企業(yè)云盤的存儲分為元數(shù)據(jù)和對象存儲兩部分,元數(shù)據(jù)存儲使用的是 MySQL,保存的是用戶,群組以及文件等實(shí)體的元數(shù)據(jù),文件的實(shí)際數(shù)據(jù)是以對象的形式保存在對象存儲中。企業(yè)云盤架構(gòu)如下:

圖片

下面介紹一下各個功能是如何實(shí)現(xiàn)的:

3.1 用戶認(rèn)證鑒權(quán)

企業(yè)云盤在用戶的身份驗證中使用了非對稱加密,前端持有一個公鑰,后端持有一個私鑰,用戶登錄時,前端首先獲取瀏覽器指紋 webFinger,同時生成一個隨機(jī)數(shù)種子 seed,然后用公鑰計算出一個特征字符串 RSA(webFinger+seed),然后將此字符串放入請求 header 中的 finger 字段,傳遞給服務(wù)端;另外企業(yè)云盤接入了 uuc 單點(diǎn)登錄系統(tǒng),uuc 登錄成功后會在請求的 cookie 字段中放置 uuc-token 和 uuc-uuid,這兩個值也會傳給后端。

服務(wù)端收到登錄請求后,先使用 cookie 中的 uuc-token 以及 uuc-uuid 調(diào)用 uuc 接口查詢得到用戶 uid, 然后嘗試從 user 表中查詢用戶信息,如果查詢不到那么說明用戶是第一次登錄企業(yè)云盤,那么服務(wù)端會從 uuc 獲取用戶信息并存儲在 user 表中;然后服務(wù)端利用私鑰解密登錄請求中的特征字符串,得到 webFinger,再根據(jù) webFinger + 當(dāng)前時間 + uid 進(jìn)行 AES 加密得到一個字符串 clouddisk-token,并將 clouddisk-token 放置在 cookie 中,返回給客戶端。在發(fā)送后續(xù)請求時,客戶端需要將 clouddisk-token 保持在 cookie 中。

在后續(xù)請求中,客戶端以同樣的方式生成 finger,并且在請求中攜帶 clouddisk-token;服務(wù)端接收到請求后,將 clouddisk-token 進(jìn)行AES解密,獲取 uid + 時間 + webFinger,同時服務(wù)端根據(jù)自身持有的私鑰,對 header 中的 finger 解密,獲取此 finger 對應(yīng)的 webFinger,與解密 token 得到的 webFinger 對比,如果相等,則驗證通過。以上過程如下圖所示:

圖片


圖片

團(tuán)隊空間的數(shù)據(jù)保存在 groups 表中,該表會記錄團(tuán)隊名稱、創(chuàng)建人等信息;用戶與團(tuán)隊空間的歸屬關(guān)系保存在 group_usrs 表中,該表會記錄每個團(tuán)隊空間有哪些用戶,以及這些用戶在團(tuán)隊空間中的權(quán)限。

在個人空間中用戶對文件有最高權(quán)限,可以任意操作;當(dāng)用戶操作的文件屬于某個團(tuán)隊空間時前端會在請求中攜帶 group_id,服務(wù)端會根據(jù) group_id 查詢 group_usrs 表,從而獲取該用戶在該團(tuán)隊空間中的權(quán)限,進(jìn)而判斷用戶是否有權(quán)限執(zhí)行相應(yīng)操作。

3.2 文件上傳

用戶可以通過點(diǎn)擊頁面的上傳按鈕然后選擇本地文件或拖拽文件/文件夾到企業(yè)云盤頁面的方式上傳文件,除此之外開啟備份策略時也會調(diào)用上傳接口;用戶發(fā)起上傳后,前端會判斷文件大小,如果在 10MB 以內(nèi)則直接上傳,否則,對于備份的文件將文件按 10MB 大小分片進(jìn)行分片上傳,其他文件按 5MB 進(jìn)行分片上傳。

所有文件的元數(shù)據(jù)都保存在 files 表中,該表會記錄文件名、文件路徑、文件所在空間、文件數(shù)據(jù)在對象存儲中的 key、文件所屬用戶等信息;所有文件夾的元數(shù)據(jù)都保存在 folder 表中,該表會記錄文件夾的名稱、路徑、文件夾所在空間、文件夾所屬用戶等信息。

3.2.1 小文件上傳

小文件上傳的邏輯如下:

  1. 查數(shù)據(jù)庫獲取用戶及其所在空間的空間信息;
  2. 空間用量校驗;
  3. 查找文件夾,如果文件夾不存在則新建文件夾;
  4. 查找文件,構(gòu)造新 files 記錄:如果文件不存在,則使用原始文件名;如果文件已存在,則在文件名后面拼接序號以區(qū)別于原文件;
  5. 上傳文件數(shù)據(jù)到對象存儲;
  6. 生成隨機(jī)字符串作為 file_mark,將第 4 步中的 files 記錄插入 files 表。

3.2.2 大文件上傳

大文件指采用分片方式上傳的文件,文件分片的信息保存在 multi 表中,multi 表會記錄分片對應(yīng)的文件、上傳者、分片總數(shù)、當(dāng)前分片編號、upload id 等信息。

大文件分片上傳分 3 個步驟:

start 階段

  1. 查數(shù)據(jù)庫獲取用戶及所在空間信息,認(rèn)證鑒權(quán);
  2. 判斷文件是否已經(jīng)存在;
  3. 查找文件夾,如果文件夾不存在則新建文件夾;
  4. 查找文件,構(gòu)造新 files 記錄:如果文件不存在,則使用原始文件名;如果文件已存在,則在文件名后面拼接序號以區(qū)別于原文件;
  5. 從對象存儲獲取用于分片上傳的 upload id;
  6. 生成隨機(jī)字符串作為 file_mark,將第 4 步中的 files 記錄插入 files 表;
  7. 將分片記錄插入 multi 表;
  8. 將 upload id 返回給客戶端,用于后續(xù)關(guān)聯(lián)分片;將 file_mark 返回給客戶端,用于后續(xù)關(guān)聯(lián)文件。

upload 階段

  1. 查數(shù)據(jù)庫獲取用戶及所在空間信息,認(rèn)證鑒權(quán);
  2. 通過 file_mark 獲取文件信息;
  3. 通過 upload id 獲取文件的分片信息;
  4. 為當(dāng)前分片生成 multi 表記錄;
  5. 將當(dāng)前分片數(shù)據(jù)上傳到對象存儲;
  6. 將第 4 步中的 multi 記錄插入 files 表。

complete 階段

  1. 查數(shù)據(jù)庫獲取用戶及所在空間信息,認(rèn)證鑒權(quán);
  2. 通過 file_mark 獲取文件信息;
  3. 通過 upload id 獲取文件的分片信息;
  4. 通知對象存儲進(jìn)行分片合并操作;
  5. 刪除該文件所有分片記錄;
  6. 更新目錄用量及文件狀態(tài)。

3.2.3 元數(shù)據(jù)與對象的對應(yīng)

以下是使用對象存儲 SDK 從對象存儲獲取對象的示例代碼:

params := &s3.GetObjectInput{
    Bucket: aws.String("BucketName"), // bucket名稱
    Key: aws.String("ObjectKey"),     // object key
}
 
resp, err := client.GetObject(params)
if err != nil{
    panic(err)
}
 
//讀取返回結(jié)果中body的前20個字節(jié)
b := make([]byte, 20)
n, err := resp.Body.Read(b)
fmt.Printf("%-20s %-2v %v\n", b[:n], n, err)

左右滑動查看完整代碼

可以看到為了從對象存儲獲取對象只需要提供一個桶名(bucket name)和鍵名(object key)即可。桶名信息在配置文件中,服務(wù)端啟動后即會加載到內(nèi)存中;object key 是通過 “用戶工號 + 路徑 + 時間戳 + _ + 文件名” 格式拼接成的字符串。

例如:

用戶 11*****9 在 2023-12-19 14:15:40 將文件 test.txt 上傳到個人空間中 /a/b/c/ 目錄下,那么這個文件對應(yīng)的 object key 就是 

11*****9/a/b/c/2023-12-19T14:15:40+08:00_test.txt;

如果這個字符串長度小于 128 字節(jié)那么就用這個字符串作為文件的 object key。如果拼接后的字符串長度大于 128 字節(jié),那么服務(wù)端會先計算文件路徑的 md5 值,記為 md5(path),然后拼接字符串:用戶工號 + / + md5(path) + 時間戳 + _ + 文件名,該 object key 生成之后會存入 files 表的 path 字段。

3.2.4 外鏈上傳

企業(yè)云盤還支持通過外鏈將文件從 Linux 機(jī)器上傳到企業(yè)云盤。使用外鏈上傳需要先申請權(quán)限,申請通過后企業(yè)云盤頁面可以看到”機(jī)房上傳“按鈕:

圖片

點(diǎn)擊該按鈕會將命令行復(fù)制到剪切板,命令行格式如下:

file="在此輸入文件名稱!";curl -s -X PUT "http://******/clouddisk-prd/******?Expires=******&AWSAccessKeyId=******&Signature=******" -H "x-amz-acl: public-read" -H "x-amz-content-maxlength: 200000000000000000" -H "Content-Type: application/octet-stream" --data-binary "@$file";curl -s -X POST "pan-idc.vivo.xyz/api/file/sync" -H "clouddisk-token: ******"  -H "finger: ******" -H "Content-Type: application/json" -H "path: ******" -H "hashname: ******" -H "filename: $file"

左右滑動查看完整代碼

將 “在此輸入文件名稱!” 部分修改為要上傳的文件名然后執(zhí)行命令行即可上傳文件。

該功能實(shí)現(xiàn)原理如下:

  1. 查數(shù)據(jù)庫獲取用戶及所在空間信息,認(rèn)證鑒權(quán);
  2. 判斷文件夾是否存在,不存在則返回錯誤;
  3. 生成外鏈。用戶點(diǎn)擊機(jī)房上傳時服務(wù)端會為文件構(gòu)造 object key,首先拼接字符串:clouddisk_ + 用戶工號 + _ + 當(dāng)前時間時間戳,然后計算該字符串的 SHA1 哈希值,記為 SHA(ut),然后拼接字符串 ”用戶工號 + 文件路徑 + / + SHA(ut)“ 作為將上傳的文件的 object key;然后用這個 object key 調(diào)用對象存儲 sdk 生成預(yù)簽名 URL 用于上傳,這個預(yù)簽名 URL 就是外鏈中第一個 curl 命令行請求的 URL。第二個 curl 用于調(diào)用企業(yè)云盤服務(wù)端接口將文件元數(shù)據(jù)寫入 MySQL,包括將 object key 寫入 files 表的 path 字段。

可以看到在用戶使用外鏈上傳文件時,時間戳起到了關(guān)聯(lián)文件數(shù)據(jù)與文件元數(shù)據(jù)的作用,因此用戶每次上傳都必須重新拷貝鏈接,而不能復(fù)用之前的鏈接,否則會導(dǎo)致已上傳的文件被覆蓋。

3.3 文件下載

用戶在企業(yè)云盤界面選中文件即可下載文件,流程如下:

  1. 查數(shù)據(jù)庫獲取用戶及所在空間信息,認(rèn)證鑒權(quán)
  2. 判斷文件是否存在
  3. 用文件的元數(shù)據(jù)中的 path 作為 object key 調(diào)用對象 SDK 獲取文件的預(yù)簽名 URL
  4. 將預(yù)簽名 URL 返回給前端,前端根據(jù)鏈接下載文件

另外用戶也可以通過機(jī)房鏈接將文件下載到 Linux 的機(jī)器上:

圖片

或者獲取辦公網(wǎng)鏈接,該鏈接可以在辦公網(wǎng)下載文件;這兩個鏈接的獲取也是調(diào)用的下載文件的接口,只是為了方便在 Linux 系統(tǒng)上下載文件而在前面拼接了 wget。

四、總結(jié)

本文簡單介紹了 vivo 企業(yè)云盤的基本功能,并介紹了這些功能在服務(wù)端具體的實(shí)現(xiàn)原理,其中重點(diǎn)介紹了認(rèn)證鑒權(quán)和文件的上傳下載。希望讀者閱讀后對 vivo 企業(yè)云盤能有更深入的了解,也希望本文能在應(yīng)用的認(rèn)證鑒權(quán)及文件的上傳下載邏輯方面對讀者有所啟發(fā)。

責(zé)任編輯:龐桂玉 來源: vivo互聯(lián)網(wǎng)技術(shù)
相關(guān)推薦

2022-12-29 08:56:30

監(jiān)控服務(wù)平臺

2022-02-18 11:13:53

監(jiān)控架構(gòu)系統(tǒng)

2024-05-27 00:00:00

PHP阿里云OSS

2023-02-07 09:43:48

監(jiān)控系統(tǒng)

2021-04-16 08:54:03

CMS系統(tǒng)redisnode服務(wù)器

2010-02-24 15:42:03

WCF服務(wù)端安全

2016-03-18 09:04:42

swift服務(wù)端

2009-08-21 15:54:40

服務(wù)端與客戶端

2009-08-21 15:36:41

服務(wù)端與客戶端

2017-10-13 15:20:14

華為華為云

2010-05-28 10:10:49

2012-03-02 10:38:33

MySQL

2013-03-25 10:08:44

PHPWeb

2024-07-19 09:01:07

2015-07-31 16:33:32

聯(lián)想

2010-08-03 09:59:30

NFS服務(wù)

2016-11-03 09:59:38

kotlinjavaspring

2021-05-25 08:20:37

編程技能開發(fā)

2021-10-19 08:58:48

Java 語言 Java 基礎(chǔ)

2015-07-31 16:14:24

聯(lián)想
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號