@columenlabs/lumen-people (法语)
Lumen's people, access and reviews, server side:谁可以签入,每个人在应用程序的每个部分可以做什么,邀请有一个过期的单一用途链接,以及每个更改的审计日志. 它与人们的屏幕结合 @columenlabs/lumen-ui/people。除此之外,没有依赖关系 @columenlabs/lumen-ui-types: 网络加密, Request 财务报告和审定财务报表 Response,所以它运行在一个工人, 一个持久对象, Bun 或节点.
- 资料来源: https://github.com/columenlabs/lumen (中文(简体) ) (单位:千美元)
packages/people麻省理工学院.
安装
bun add @columenlabs/lumen-people @columenlabs/lumen-ui-types
将两者钉入与其他卢门包相同的精确版本.
范围和级别
一个范围是任何访问内容:一个应用程序,或者一个内部的构造(一个文件夹,一个集合). 各有自定水平,最低为第一(None, View, Edit, Admin 当它没有命名时。 一个人每个范围拥有一个级别;任何补助金都是最低的。 管理者在任何地方都拥有最高层;残疾人和过期邀请书拥有最低层.
import type { Scope } from '@columenlabs/lumen-ui-types/people';
export const SCOPES: Scope[] = [
{ id: 'tools', name: 'Tools' },
{ id: 'recipes', name: 'Recipes' },
{ id: 'collections', name: 'Collections', parent: 'recipes', resourceLabel: 'Collection' },
];
服务
import { can, createPeople, doSql, sqlStore } from '@columenlabs/lumen-people';
// In a Durable Object, so the admin floor check and its write never interleave:
const people = createPeople({
store: sqlStore(doSql(ctx.storage.sql)), // or sqlStore(d1Sql(env.DB))
scopes: SCOPES,
fixedAdmins: ['[email protected]'], // always an active admin
inviteDays: 7,
});
const person = await people.seen('[email protected]'); // on each sign-in: null = refuse
can(person, SCOPES[0], 'view', SCOPES); // the one check a route makes
它所遵守的规则:
- 一个主动管理员总是;内置管理员永远不能失去它.
- 只有管理员邀请、更改访问或删除;拒绝也会被记录.
- 一个邀请链接是单用;只有它的SHA-256散列被存储. Resend 创建了新链接并重新启动时钟, 撤销它 。 被邀请人过世 被拒签,直到怨恨.
- 每一个变化都是一个审计事件(谁、何时、何地)保留了一年.
路线
import { peopleRoutes } from '@columenlabs/lumen-people/routes';
const routes = peopleRoutes({
base: '/api/people',
people: () => people, // or a Durable Object stub
actor: (req) => ({ email, admin, via: 'app' }), // your verified caller
scopes: SCOPES,
appName: 'Example',
link: (token) => `https://app.example.com/invite/${token}`,
mailer: () => myMailer, // optional: (msg) => { ok, detail }
onRemove: async (person) => { /* delete their data */ },
});
app.all('/api/people/*', (c) => routes(c.req.raw));
没有邮递员, 每份邀请函都会返回手抄录的链接; 失败的发送永远不会撤销邀请函 .