victorious-train-972
08/16/2023, 2:46 PMOrganizations
contain members
, a member
can also be an owner
2. A Organization
can be a child of another Organization
3. owners
and members
of a parent Organization
are also owners
and members
of any child Organization
4. owners
can manage
an Organization
, including any child Organizations
victorious-train-972
08/16/2023, 2:47 PMclass Organization implements Namespace {
related: {
parent: Organization[]
owners: User[]
members: User[]
}
permits = {
manage: (ctx: Context) => this.related.owners.includes(ctx.subject) || this.related.parent.traverse(o => o.permits.manage(ctx)),
}
}
victorious-train-972
08/16/2023, 2:49 PMOrganization:1
owners: [User:1]
members: [User:1, User:2]
Organization:1.1
parent: [Organization:1]
members: [User:3]
When I check if User:1 can manage Organization1.1
, I would expected yes but we're getting a nosteep-lamp-91158
full-book-15949
08/16/2023, 8:05 PMimport { Namespace, Context } from "@ory/keto-namespace-types"
class User implements Namespace {}
class Group implements Namespace {
related: {
members: User[]
}
permits = {
view_members: (ctx: Context): boolean =>
this.related.members.includes(ctx.subject),
}
}
class Document implements Namespace {
related: {
groups: Group[]
}
permits = {
read: (ctx: Context): boolean =>
this.related.groups.traverse((group) => group.related.members.includes(ctx.subject)),
}
}
This is like yours, but didn’t work for me. read
is always denied. I was surprised.
I refactored to this:
import { Namespace, SubjectSet, Context } from "@ory/keto-namespace-types"
class User implements Namespace {}
class Group implements Namespace {
related: {
members: User[]
}
permits = {
view_members: (ctx: Context): boolean =>
this.related.members.includes(ctx.subject),
}
}
class Document implements Namespace {
related: {
collaborators: (User | SubjectSet<Group, "members">)[]
}
permits = {
read: (ctx: Context): boolean =>
this.related.collaborators.includes(ctx.subject),
}
}
This worked.
Tuples are like this:
{
"namespace": "Document",
"object": "bake-a-cake-recipe",
"relation": "collaborators",
"subject_set": {
"namespace": "Group",
"object": "red-group",
"relation": "members"
}
}
victorious-train-972
08/16/2023, 8:41 PMSubjectSets
, I still find a bit hard to understand how they work, couldn't find much in the docs about subject sets