服务器 谁可以做什么
谁可以做什么
ReboFiles 本身没有用户体系。
identify 根据你的会话判断谁在请求;authorize 在每条路由上被调用,并传入所涉及的条目。本页内容
identify
它接收 Request,为已登录的人返回 { id },否则返回 null(响应 401)。这个 id 就是网盘称呼他们的方式:所有者、共享、动态记录。admin: true 在使用 byRoles 时可以配置网盘。
操作
| 操作 | 询问时机 |
|---|---|
| list | 文件夹中的内容;null 表示根目录。之后会对其中每个条目询问 read。 |
| read | 单个条目、搜索、最近、回收站、动态记录:一个人能看到的一切。 |
| create | 创建文件夹,附带它所在的文件夹。 |
| upload | 上传文件,附带它所在的文件夹;新版本、缩小的图片、文字,附带该文件。完成时会再次询问。 |
| rename | 重命名条目,或为文件夹设置颜色。 |
| move | 先询问条目,再询问目标文件夹。 |
| trash, restore | 移入回收站,以及从回收站恢复。 |
| delete | 永久删除:文件内容从存储桶中删除。 |
| download | 获取读取文件的地址,有效期几分钟。 |
| comment | 目前尚未用于任何操作:评论者在查看者之外可以做的事。 |
| share | 共享、撤回共享,以及链接。 |
| configure | 整个网盘的设置。使用 byRoles 时,identify 返回 { id, admin: true } 的用户。 |
byRoles
根据网盘本身判断:所有者可以对条目及其中的内容做任何事;被共享的人可以做其角色允许的事。查看者可以浏览、阅读和下载;编辑者还可以创建、上传、重命名、移动和移到回收站;只有所有者可以永久删除和共享。任何已登录的人都可以查看根目录并在其中放置内容;每个人只看到自己的。
你自己的规则
在你的规则中调用 byRoles。第四个参数是整个网盘,便于编写需要查看条目所在文件夹的规则。
lib/auth.ts
import { type Action, type User, byRoles } from '@rebofiles/server';
import type { Drive, Entry } from '@rebofiles/core';
export function mayI(user: User, action: Action, entry: Entry | null, drive: Drive): boolean {
// Your rules first: an auditor may look at everything, never change it.
if (isAuditor(user)) return ['list', 'read', 'download'].includes(action);
return byRoles(user, action, entry, drive);
}被拒绝时
Sign in first. · You may not do that here.
401 表示 identify 返回了 null;403 表示 authorize 返回了 false。
群组
createDriveHandler({
// …
identify: async (request) => {
const user = await session(request);
// The groups your application says they are in: what is shared with "group:sales" is theirs to read.
return user ? { id: user.id, groups: await groupsOf(user.id) } : null;
},
authorize: byRoles,
});
await client.share(folder.id, 'group:sales', 'editor');共享可以按 id 指定某人,用 * 指定所有已登录用户,或用 group:<id> 指定群组。群组成员由你的应用决定,由 identify 随每个人一起给出:网盘不保存成员列表,因此在你的应用中加入或离开团队的人,在下一次请求时就会获得或失去相应的权限。在共享对话框中,像输入 id 一样输入 group:sales;“与我共享”会显示共享给其所在群组的内容。