權限與授權
了解 Unit 級操作權限、各產品的物件權限,以及前後端共同授權。
Univer 將權限分為整份內容的操作權限與內容內部的物件權限。Web SDK 依權限控制互動和命令執行;Server SDK 在讀取、協同提交和擴充服務邊界執行應用的授權策略。
Unit 級權限
一個 Unit(內容單元) 是一份完整的內容實例,例如一份活頁簿、文件、簡報、Relational Table、畫布或 PDF。以下 Unit 權限適用於 Sheet、Doc、Slide、Relational Table 和 Canvases;PDF 的目前範圍見下文。
| 權限 | 控制什麼 | 典型用法 |
|---|---|---|
| 編輯(Edit) | 修改內容和結構。 | 檢視者唯讀,編輯者可以填寫和調整內容。 |
| 複製(Copy) | 在編輯器中複製內容。 | 允許閱讀和留言,同時限制內容複製。 |
| 留言(Comment) | 啟用留言功能後建立留言或回覆。 | 允許審閱者提出意見,同時保持正文唯讀。 |
| 列印(Print) | 使用產品的列印功能。 | 允許線上閱讀,同時限制列印。 |
| 匯出(Export) | 將內容匯出為支援的檔案格式。 | 為交付或封存開放檔案匯出。 |
編輯與留言相互獨立。留言的編輯、刪除和管理還應遵守應用對作者、擁有者等身分的策略。
列印和匯出同樣屬於 Unit 級權限。Sheet、Doc、Slide 和 Canvases 提供 Print 與 Export;Relational Table 目前提供 Export。各權限點需要搭配對應的功能外掛。
複製內容、複製整份檔案、匯出和下載屬於不同操作,需要分別設定。是否允許開啟檔案,由應用的讀取授權決定。
例如,Docs 可獨立控制整份文件的 Unit 級權限:
import { UnitAction } from '@univerjs/protocol'const document = univerAPI.getActiveDocument()if (!document) throw new Error('Open a document first')const permission = document.getPermission()await permission.setReadOnly()await permission.setPoint(UnitAction.Copy, false)await permission.setPoint(UnitAction.Comment, true)await permission.setPoint(UnitAction.Print, false)await permission.setPoint(UnitAction.Export, false)範例需要已註冊相應產品與留言外掛;外掛模式還需匯入 @univerjs/docs/facade。各產品的權限入口見下文,Sheets 使用自己的權限點列舉。
各產品的細部權限
試算表(Sheet)
權限分為活頁簿 → 工作表 → 儲存格範圍。活頁簿決定整份內容的編輯、複製、留言等能力;工作表可進一步限制儲存格值、樣式、列欄增刪、排序、篩選、樞紐分析表與附加物件操作。範圍保護可控制指定範圍的編輯和檢視,並指定允許編輯的協作者。
例如,鎖定預算公式欄,只開放費用填寫區。入口分別為 getWorkbookPermission()、getWorksheetPermission() 和 getRangePermission();設定工作表和範圍的保護權限前,先建立相應保護規則。涉及不可讀取的資料時,應用讀取介面也需依業務策略控制回傳範圍。
文件(Doc)
在整份文件之下,可以控制節(Section)、段落和內容實體的編輯權限。實體包括表格、繪圖、自訂區塊或範圍等具有穩定識別碼的內容;頁首、頁尾中的段落也透過所屬 segment 定位。
例如,保護合約固定條款,只開放待填寫段落。段落和節使用 getPermission(),內容實體使用 document.getEntityPermission();物件權限由文件、適用父層與自身規則共同決定。
簡報(Slide)
權限可作用於簡報、單張投影片、頁面元素以及母片編輯入口與元素。可以保護品牌範本和固定圖形,同時開放業務頁面中的文字方塊、圖片或圖表物件。
整份簡報使用 presentation.getPermission(),單頁使用 slide.getPermission(),單一元素使用 slide.getElementPermission()。母片相關入口見 Presentation Facade。
Slides 權限 · Presentation Facade
關聯式表格(Relational Table)
Relational Table 可以控制資料表、欄位、記錄、檢視與儀表板。編輯一個儲存格時,會同時考慮 Relational Table、資料表、欄位和記錄的編輯限制;檢視設定與儀表板也可分別保護。
例如,保護欄位結構與財務記錄,允許業務人員維護日常任務。資料表、欄位、記錄和檢視透過各自的 getPermission() 設定;儀表板需要相應外掛。依使用者篩選可讀取的欄位或記錄,應由應用的資料讀取策略實作。
Relational Table 權限 · 物件權限 API
畫布(Canvases)
在整個 Canvases 的權限之下,可以控制單一元素的編輯,例如圖形、文字、圖片或連接線。適合保護架構底圖、流程框架,同時允許協作者維護指定節點。
整份畫布使用 board.getPermission(),元素使用 board.getElementPermission(elementId)。元素的有效編輯權限同時受 Canvases 級和元素級規則約束。
PDF 目前主要透過檢視 / 編輯模式控制本機互動,與上述五類產品的 Unit / Object 權限 API 範圍不同。檔案讀取、下載和匯出策略由應用後端接入;PDF 目前也不屬於核心協同服務支援的五類 Unit。
權限繼承與協作者策略
物件級許可不能突破產品級和適用父層的限制。 例如,整份文件唯讀時,單獨將某段落設為可編輯,最終仍不可編輯。透過 canEdit() 查詢相應物件的有效結果。
Doc、Slide、Relational Table 和 Canvases 的子物件權限主要控制 Edit;複製和留言在產品級設定。Sheets 另外提供工作表和選取範圍的專用權限,各產品的權限粒度不同。
對 Doc、Slide、Relational Table 和 Canvases,可透過 setObjectPermissions() 批次管理物件的協作者策略:
| 策略 | 允許誰編輯物件 |
|---|---|
all | 已具有該 Unit 編輯權限的協作者。 |
owner | 物件擁有者,同時保留產品與父層權限約束。 |
members | 指定的現有 Unit 協作者。 |
這類策略需要接入 Authz 服務、為目標類型設定 objectPermissionTypes,並持久化物件綁定、規則和成員關係。請使用 SDK 匯出的物件 ID helper,保持內容物件 ID 穩定;policy: null 用於移除保護並恢復繼承。批次設定可能部分失敗,應檢查 failed 與 refreshError。Sheets 透過工作表 / 範圍保護介面接入相應策略。
前後端如何共同授權
應用維護一套可信的使用者身分、角色與文件 / 物件策略,分別驅動前端權限表現和伺服器端檢查。
| 層級 | 負責什麼 |
|---|---|
| Web SDK | 取得目前使用者的授權結果,更新權限點、編輯入口與命令檢查,回饋受限制的操作。 |
| 應用 Authz 介面 | 根據可信登入身分查詢或修改規則,回傳 Unit / 物件的實際權限,並驗證規則管理資格。 |
| Transport | 驗證 Cookie、Session 或 Token,建立可信身分;瀏覽器提交的使用者欄位不能作為授權依據。 |
| Endpoint | 校驗 WebSocket 連線與 joinUnit,控制是否可以加入文件的即時房間。 |
| Service | 在 readUnitData 校驗讀取,在 submitChangeset 校驗提交;涉及物件級策略時,在套用階段結合目前內容模型校驗受影響物件。 |
Server SDK 提供 Middleware 授權入口,具體 ACL 和物件策略由應用提供。前端設定唯讀或物件保護,不會自動取代伺服器端校驗。 只有 Unit 級編輯檢查的應用,還需補充細部物件檢查,才能落實段落、元素、欄位或記錄的業務限制。
例如,已建立的 collabService 可接入應用自己的 acl:
import { CollabError } from '@univerjs-pro/collaboration-service'collabService.use('submitChangeset', async (context, next) => { const allowed = await acl.canEdit( context.session.userId, context.request.changeset.unitID, ) if (!allowed) { throw new CollabError('PERMISSION_DENIED', 'Editing is not allowed') } await next()})本例只示範 Unit 級編輯授權。完整接入還需保護讀取、JOIN、權限規則修改以及擴充模組介面。對細部修改,可在 applyChangeset 等套用階段校驗實際受影響的物件,並保持策略可重試。
從身分與權限了解接入方式,生命週期入口見 Middleware 與 Event。
你覺得這篇文檔如何?