参考手册Workspace 包参考

Permissions

权限控制系统

本页介绍项目中的权限控制方案。若你正在按功能启用或改造模板,先看 权限与风控

@01mvp/permissions

这是什么

权限控制 = 决定"谁"可以"做什么"。比如:普通用户能编辑自己的帖子但不能删别人的帖子,管理员什么都能干。

项目里有两套权限方案,用途不同:

方案用途状态
@01mvp/auth/permissions生产环境权限控制hasPermission()isAdmin 等函数)主力使用
@01mvp/permissions (本页)基于 CASL 的属性级权限控制实验性,目前仅在 Demo 页面使用

如果你要做权限控制,推荐直接用 @01mvp/auth/permissions 的方案,它更简单直接:

import { hasPermission, AdminPermission } from "@01mvp/auth/permissions";

// 检查是否有管理员权限
if (hasPermission(session, AdminPermission)) {
  // 允许访问
}

@01mvp/permissions(CASL 方案)

这是什么

基于 CASL 库实现的权限控制,可以做到比"管理员/普通用户"更细粒度的控制。比如:同是普通用户,只能编辑自己创建的项目,不能编辑别人的。

能做什么

  • 按角色(Role)分配权限:USER(普通用户)vs ADMIN(管理员)
  • 按操作(Action)控制:CREATE(创建)、READ(查看)、UPDATE(修改)、DELETE(删除)、MANAGE(全部)
  • 按资源(Subject)控制:PROJECT(项目)、USER(用户资料)、SETTINGS(设置)
  • 资源级检查:比如检查"这个用户是不是这个项目的创建者"

怎么用

import { can, Action, Subject } from "@01mvp/permissions";

// 检查用户能不能创建项目
if (can(user, Action.CREATE, Subject.PROJECT)) {
  // 可以创建
}

// 检查是不是管理员(能管理所有资源)
if (can(user, Action.MANAGE, Subject.ALL)) {
  // 是管理员
}

大概原理

  1. 每个用户有一个角色(USER 或 ADMIN)
  2. 系统里预先定义好每个角色能做什么操作(比如 USER 能创建/更新/查看项目,但不能删除)
  3. 调用 can(用户, 操作, 资源) 时,CASL 去查这个用户"能不能做这件事"
  4. 如果能就返回 true,不能就返回 false

权限规则速览

  • 管理员 -- 可以管理所有资源
  • 普通用户 -- 可以创建、查看、更新项目;可以改自己的资料;可以查看设置;不能删除资源;不能管理其他用户

如需添加新角色(如 MODERATOR),编辑 packages/permissions/src/ 下的类型和规则文件即可。

相关链接