Univer
Univer Sheet
功能
权限控制

权限控制

📊 Univer Sheet

是用来处理前端场景的权限拦截,当发现没有对应点位权限的时候,会终止代码执行并提示用户缺失权限。

如何使用

  1. 通过命令模式驱动

通过驱动command来执行对应的权限设置,请参考 权限设置demo 中关于工作表权限设置的代码实现。

如果你想设置区域保护,只需修改驱动的command以及对应的参数,具体内容请参考 code (opens in a new tab)

  1. 通过facadeAPI来调用,在facade实例上,我们暴露了一个可调节工作簿编辑权限的API,你可以通过调用这个API来设置工作簿的编辑权限。
import { FUniver } from "@univerjs/facade";
 
const univerAPI = FUniver.newAPI(univer);

然后你就可以通过调用 univerAPI 的方法来使用 Univer 了,例如设置整体工作簿不可编辑:

univerAPI.setWorkbookEditable(false);

本质是通过设置权限点位的值来控制权限的开关,权限点位对应的command在执行前会去读取该点位的值,假如权限值为false,则会终止command的执行。

  1. 拓展使用

这里以WorkbookEditablePermission举例,在自己的插件中增加权限校验,其他点位类似

import { WorkbookEditablePermission } from '@univerjs/sheets';
import { IPermissionService } from '@univerjs/core';
 
class YourService {
  constructor(@IPermissionService private _permissionService: IPermissionService) {
 
  }
 
  setWorkbookNotEditable() {
    this._permissionService.updatePermissionPoint(new WorkbookEditablePermission('unitId').id, false);
  }
 
  setWorkbookEditable() {
    this._permissionService.updatePermissionPoint(new WorkbookEditablePermission('unitId').id, true);
  }
}

你也可以拓展修改别得权限点位来实现对不同功能的权限控制,具体点位列表请参考文章底部。

第三方插件如何扩展权限点位

import { IPermissionService,IPermissionPoint } from '@univerjs/core';
 
export class CustomPermissionPoint implements IPermissionPoint {
  type = UnitObject.Unkonwn; // your type
  subType = UnitAction.View; // your subType
  status = PermissionStatus.INIT;
  value = true; // 权限的初始值
  id: string;
  constructor(unitId: string, subUnitId: string, customId: string) {
    // 这里自行拼凑一个 id,id 属性需要保证在整个 IPermissionService 中是唯一的凭证。
    this.id = `${unitId}.${subUnitId}.${customId}`;
  }
}
 
class YourService {
  constructor(@IPermissionService private _permissionService: IPermissionService) {
    this._init()
  }
 
  _init() {
    this._permissionService.addPermissionPoint(new CustomPermissionPoint('unitId', 'subUnitId', 'my-id'));
  }
}
 
// 在其他地方如何使用
class ConsumeService {
  constructor(@IPermissionService private _permissionService: IPermissionService) {
  }
 
  doSomething() {
   const point = this._permissionService.getPermissionPoint(new CustomPermissionPoint('unitId', 'subUnitId', 'my-id').id);
   console.log(point.value);
  }
 
  bindEvent() {
    // 这将获得一个 Rx 对象,使得你能够监听当前权限的变化作出一些改变
    const pount$ = this._permissionService.getPermissionPoint$(new CustomPermissionPoint('unitId', 'subUnitId', 'my-id').id);
    console.log(pount$);
  }
}

第三方权限服务接入

权限的判断逻辑通常是由一个外置服务来单独处理,这部分一般会带有一个通信流程,在纯前端 sdk 实现中,我们使用 AuthzIoLocalService (opens in a new tab) 来承载这部分逻辑.

在生产环境中,我们需要将这部分实现转由后端实现,前端需要基于IAuthzIoService (opens in a new tab)类型实现对应的请求函数,来进行运行时的替换。

下面是一个简单的示例:

import { IAuthzIoService, Univer } from '@univerjs/core';
import { Injector } from '@wendellhu/redi';
 
class YourAuthzService implements IAuthzIoService { }
 
export class YourPlugin extends Plugin {
  override onStarting(injector: Injector): void {
    injector.add([IAuthzIoService, { useClass: YouAuthzService }]);
  }
}
 
// 通过将 override 选项设置为[[IAuthzIoService, null]],可以告诉 Univer 不要注册内置的 IAuthzIoService。
// 这样,Univer 将使用你在 YourAuthzService 中提供的服务作为权限服务的实现。
const univer = new Univer({
  override: [[IAuthzIoService, null]],
});
 
univer.registerPlugin(YourPlugin);

权限点位列表

具体的点位代码,参阅 code (opens in a new tab)

如果 workbook 的权限控制和 worksheet/range 有交叉,那么必须全部为 true 才能使用.

Workbook 工作簿

PermissionDescription
WorkbookEditablePermission能否编辑
WorkbookPrintPermission能否打印
WorkbookCommentPermission能否评论
WorkbookViewPermission能否查看
WorkbookCopyPermission能否复制
WorkbookExportPermission能否导出
WorkbookManageCollaboratorPermission能否管理协作者

Worksheet 工作表

PermissionDescription
WorksheetCopyPermission能否复制
WorksheetDeleteColumnPermission能否删除列
WorksheetDeleteRowPermission能否删除行
WorksheetFilterPermission能否过滤
WorksheetInsertColumnPermission能否插入列
WorksheetInsertHyperlinkPermission能否使用超链接
WorksheetInsertRowPermission能否插入行
WorksheetPivotTablePermission能否使用透视表
WorksheetSetCellStylePermission能否编辑单元格样式
WorksheetSetCellValuePermission能否编辑单元格值
WorksheetSetColumnStylePermission能否设置列样式
WorksheetSetRowStylePermission能否设置行样式
WorksheetSortPermission能否排序
WorksheetViewPermission能否查看
WorksheetEditPermission能否编辑

Range 区域保护

PermissionDescription
RangeProtectionPermissionViewPoint能否查看保护区域的内容
RangeProtectionPermissionEditPoint能否编辑保护区域

Copyright © 2021-2024 DreamNum Co,Ltd. All Rights Reserved.