权限控制
📊 Univer Sheet
是用来处理前端场景的权限拦截,当发现没有对应点位权限的时候,会终止代码执行并提示用户缺失权限。
如何使用
- 通过命令模式驱动
通过驱动command来执行对应的权限设置,请参考 权限设置demo 中关于工作表权限设置的代码实现。
如果你想设置区域保护,只需修改驱动的command以及对应的参数,具体内容请参考 code (opens in a new tab)
- 通过facadeAPI来调用,在facade实例上,我们暴露了一个可调节工作簿编辑权限的API,你可以通过调用这个API来设置工作簿的编辑权限。
import { FUniver } from "@univerjs/facade";
const univerAPI = FUniver.newAPI(univer);
然后你就可以通过调用 univerAPI
的方法来使用 Univer 了,例如设置整体工作簿不可编辑:
univerAPI.setWorkbookEditable(false);
本质是通过设置权限点位的值来控制权限的开关,权限点位对应的command在执行前会去读取该点位的值,假如权限值为false,则会终止command的执行。
- 拓展使用
这里以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 工作簿
Permission | Description |
---|---|
WorkbookEditablePermission | 能否编辑 |
WorkbookPrintPermission | 能否打印 |
WorkbookCommentPermission | 能否评论 |
WorkbookViewPermission | 能否查看 |
WorkbookCopyPermission | 能否复制 |
WorkbookExportPermission | 能否导出 |
WorkbookManageCollaboratorPermission | 能否管理协作者 |
Worksheet 工作表
Permission | Description |
---|---|
WorksheetCopyPermission | 能否复制 |
WorksheetDeleteColumnPermission | 能否删除列 |
WorksheetDeleteRowPermission | 能否删除行 |
WorksheetFilterPermission | 能否过滤 |
WorksheetInsertColumnPermission | 能否插入列 |
WorksheetInsertHyperlinkPermission | 能否使用超链接 |
WorksheetInsertRowPermission | 能否插入行 |
WorksheetPivotTablePermission | 能否使用透视表 |
WorksheetSetCellStylePermission | 能否编辑单元格样式 |
WorksheetSetCellValuePermission | 能否编辑单元格值 |
WorksheetSetColumnStylePermission | 能否设置列样式 |
WorksheetSetRowStylePermission | 能否设置行样式 |
WorksheetSortPermission | 能否排序 |
WorksheetViewPermission | 能否查看 |
WorksheetEditPermission | 能否编辑 |
Range 区域保护
Permission | Description |
---|---|
RangeProtectionPermissionViewPoint | 能否查看保护区域的内容 |
RangeProtectionPermissionEditPoint | 能否编辑保护区域 |