Разрешения и авторизация
Разрешения действий уровня Unit, права объектов по продуктам и авторизация на клиенте и сервере.
Univer разделяет действия над единицей контента целиком и права на объекты внутри неё. Web SDK управляет взаимодействием и выполнением команд, а Server SDK предоставляет точки авторизации для чтения, отправки совместных изменений и сервисов расширений.
Разрешения уровня Unit
Unit (единица контента) — один полный экземпляр содержимого: книга, документ, презентация, Relational Table, доска или PDF. Приведённые ниже разрешения относятся к Sheets, Docs, Slides, Relational Table и Canvases; текущие возможности PDF описаны далее.
| Разрешение | Что контролирует | Пример |
|---|---|---|
| Редактирование (Edit) | Изменение содержимого и структуры. | Читатели просматривают, редакторы заполняют и меняют структуру. |
| Копирование (Copy) | Копирование содержимого в редакторе. | Разрешить чтение и комментарии, ограничив копирование. |
| Комментарии (Comment) | Создание комментариев и ответов при установленной функции. | Разрешить рецензирование, оставив основной текст доступным только для чтения. |
| Печать (Print) | Использование функции печати продукта. | Разрешить чтение онлайн, ограничив печать. |
| Экспорт (Export) | Выгрузка содержимого в поддерживаемый формат файла. | Разрешить передачу результатов или архивирование. |
Редактирование и комментирование независимы. Изменение, удаление и управление комментариями также подчиняются политикам приложения для авторов и владельцев.
Print и Export также относятся к уровню Unit. Sheets, Docs, Slides и Canvases предоставляют оба разрешения; Relational Table пока предоставляет Export. Каждое разрешение используется с плагинами соответствующей функции.
Копирование содержимого, дублирование файла, экспорт и скачивание являются отдельными операциями. Возможность открыть файл определяется авторизацией чтения в приложении.
Например, настройте разрешения уровня Unit для Doc независимо:
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 использует собственные перечисления точек разрешений.
Детальные права по продуктам
Sheets
Иерархия прав: книга → лист → диапазон ячеек. Книга управляет общими правами редактирования, копирования и комментариев. Лист позволяет ограничивать значения, стили, добавление и удаление строк и столбцов, сортировку, фильтры, сводные таблицы и дополнительные объекты. Защита диапазона управляет редактированием и просмотром, позволяя указать допущенных участников.
Например, защитите формулы бюджета, оставив доступной область ввода расходов. Используйте getWorkbookPermission(), getWorksheetPermission() и getRangePermission(). Перед настройкой точек защиты создайте правило защиты листа или диапазона. Для недоступных для чтения данных API приложения также должен ограничивать возвращаемое содержимое.
Docs
Внутри документа можно защищать разделы, абзацы и сущности контента. Сущности включают таблицы, рисунки, пользовательские блоки и диапазоны со стабильными идентификаторами. Абзацы колонтитулов адресуются через свой segment.
Например, защитите фиксированные условия договора, разрешив заполнять отдельные абзацы. Для разделов и абзацев доступен getPermission(), для сущностей — document.getEntityPermission(). Эффективное разрешение объединяет правила документа, применимых родителей и самого объекта.
Права документа · Права разделов, абзацев и сущностей
Slides
Защищайте презентацию, отдельные слайды, элементы страницы, доступ к редактированию образца и его элементы. Можно сохранить фирменные шаблоны и фиксированную графику, открыв для редактирования выбранные текстовые поля, изображения и диаграммы.
Используйте presentation.getPermission(), slide.getPermission() и slide.getElementPermission(). Доступ к правам образцов описан в Presentation Facade.
Права Slides · Presentation Facade
Relational Table
Управляйте таблицами, полями, записями, представлениями и панелями. При редактировании ячейки учитываются ограничения Relational Table, таблицы, поля и записи вместе. Настройки представлений и панели можно защищать отдельно.
Например, защитите схему и финансовые записи, разрешив обновление повседневных задач. Таблицы, поля, записи и представления предоставляют getPermission(); для панелей нужен соответствующий плагин. Фильтрацию доступных для чтения полей и записей по пользователю реализует политика чтения данных приложения.
Права Relational Table · API прав объектов
Canvases
Под общими правами Canvases защищайте отдельные элементы: фигуры, текст, изображения и соединители. Это позволяет зафиксировать фон архитектуры или каркас процесса и разрешить участникам обновлять выбранные узлы.
Для Unit используйте board.getPermission(), для элементов — board.getElementPermission(elementId). Для редактирования элемента нужны разрешения и на Canvases, и на сам элемент.
Права Canvases · Права элементов
PDF пока использует режимы просмотра и редактирования для локального взаимодействия; их область отличается от API прав Unit/Object пяти продуктов. Чтение, скачивание и экспорт файлов авторизует сервер приложения. PDF также не входит в пять типов Unit, поддерживаемых Core Collaboration.
Интеграция PDF и работа с содержимым
Наследование и политики участников
Разрешение на объект не отменяет ограничения Unit и применимых родителей. Если документ доступен только для чтения, разрешение на редактирование отдельного абзаца не даст его изменить. Проверяйте эффективный результат через canEdit() у поддерживаемых объектов.
Права дочерних объектов Docs, Slides, Relational Table и Canvases в основном управляют Edit; Copy и Comment задаются на уровне Unit. У Sheets есть дополнительные точки для листов и диапазонов, поэтому детализация зависит от продукта.
Docs, Slides, Relational Table и Canvases предоставляют setObjectPermissions() для пакетного управления политиками участников:
| Политика | Кто может редактировать объект |
|---|---|
all | Участники, уже имеющие Edit на Unit. |
owner | Владелец объекта с учётом ограничений Unit и родителей. |
members | Выбранные существующие участники Unit. |
Нужны интеграция Authz, настройка objectPermissionTypes для целевых типов и сохранение привязок объектов, правил и участников. Используйте экспортируемые хелперы ID и сохраняйте стабильность идентификаторов контента. policy: null снимает защиту и возвращает наследование. Пакетная запись может завершиться частично: проверяйте failed и refreshError. Sheets использует API защиты листов и диапазонов.
Авторизация на клиенте и сервере
Используйте единую доверенную идентификацию пользователей и систему политик Unit и объектов, управляющую поведением клиента и авторизацией сервера.
| Уровень | Ответственность |
|---|---|
| Web SDK | Получать допустимые действия пользователя, обновлять точки разрешений, элементы редактирования и проверки команд. |
| Authz API приложения | Запрашивать и менять политики на основе доверенной идентификации, возвращать эффективные права Unit/объектов и проверять право управления правилами. |
| Transport | Проверять Cookie, Session или Token и устанавливать доверенную идентификацию. Поля пользователя из клиента не являются основанием авторизации. |
| Endpoint | Авторизовать подключения WebSocket и вход в комнаты через joinUnit. |
| Service | Проверять чтение в readUnitData, отправку в submitChangeset и затронутые объекты на этапе применения изменений. |
Server SDK предоставляет Middleware, а приложение — ACL и политики объектов. Режим только для чтения и защита объектов на клиенте не применяют серверную авторизацию автоматически. Если проверяется только Edit на 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 и Events.
Насколько полезно это руководство?