参考手册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(普通用户)vsADMIN(管理员) - 按操作(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)) {
// 是管理员
}大概原理
- 每个用户有一个角色(USER 或 ADMIN)
- 系统里预先定义好每个角色能做什么操作(比如 USER 能创建/更新/查看项目,但不能删除)
- 调用
can(用户, 操作, 资源)时,CASL 去查这个用户"能不能做这件事" - 如果能就返回
true,不能就返回false
权限规则速览
- 管理员 -- 可以管理所有资源
- 普通用户 -- 可以创建、查看、更新项目;可以改自己的资料;可以查看设置;不能删除资源;不能管理其他用户
如需添加新角色(如 MODERATOR),编辑 packages/permissions/src/ 下的类型和规则文件即可。
相关链接
- CASL 文档
- @01mvp/auth 包 -- 认证和权限方案
- 权限与风控指南