@mostajs/rebac
v0.1.0
Published
ReBAC (Relationship-Based Access Control) pour @mostajs — tuples de relations + réaccessibilité par graphe via le moteur Prolog de @mostajs/rules. Composable en attribut/PIP dans abac/pbac.
Maintainers
Readme
@mostajs/rebac
Auteur : Dr Hamid MADANI [email protected] · Licence : AGPL-3.0-or-later Statut : ✅ 0.1.0 — 7 tests verts.
ReBAC (Relationship-Based Access Control) pour @mostajs — le 5e modèle du
continuum. Décide via des relations entre entités (façon Google Zanzibar) :
tuples directs + relations calculées, évaluées par le moteur Prolog de
@mostajs/rules.
Symétrie :
abacdélègue ses conditions au moteur jsonlogic derules;rebacdélègue la réaccessibilité au moteur Prolog derules. Zéro réinvention.
Modèle
import { createRebac } from "@mostajs/rebac";
const rebac = createRebac({
tuples: [
{ subject: "user:u7", relation: "member", object: "team:A" },
{ subject: "team:A", relation: "owner", object: "doc:1" },
],
rules: [ // relations CALCULÉES = clauses Prolog can/3 (faits rel/3 + base can:-rel auto)
{ relation: "viewer", clause: "can(S, viewer, O) :- rel(T, owner, O), can(S, member, T)." },
],
});
await rebac.check("user:u7", "viewer", "doc:1"); // true (membre de l'équipe propriétaire)
await rebac.check("user:u9", "viewer", "doc:1"); // false (deny-by-default)Intégration ABAC/PBAC (PIP inline, côté app)
ReBAC répond en asynchrone (graphe) ; ABAC/PBAC évaluent des conditions sync. Le pont est un PIP qui pré-calcule les relations en attributs — écrit par l'app (le « sac d'attributs » est le domaine de pbac, pas de rebac) :
import { authorize } from "@mostajs/pbac";
const pip = async (bag) => ({
...bag,
environment: { ...bag.environment,
canView: await rebac.check(`user:${bag.subject.id}`, "viewer", `doc:${bag.resource.id}`) },
});
// policy.condition : { "==": [ { var: "env.canView" }, true ] }
await authorize(bag, { set, pip });Persistance
Les tuples durables passent par @mostajs/access-control-store
(createDurableRelationStore, data-plug/ORM). Par défaut, rebac reste en mémoire.
Démos
node examples/demo.mjs # graphe : relations directes + calculées
node examples/pbac-integration.mjs # rebac → PIP → décision pbac