|
1 | | -# Google Docs-style Sharing |
| 1 | +# Group membership and parent-of/child-of relations |
2 | 2 |
|
3 | | -Models a Google Docs-style sharing permission system where users can be granted direct access to a resource, or access via organizations and nested groups. |
4 | | - |
5 | | ---- |
6 | | - |
7 | | -## Schema |
8 | | - |
9 | | -``` |
10 | | -definition user {} |
11 | | -
|
12 | | -definition resource { |
13 | | - relation manager: user | usergroup#member | usergroup#manager |
14 | | - relation viewer: user | usergroup#member | usergroup#manager |
15 | | -
|
16 | | - permission manage = manager |
17 | | - permission view = viewer + manager |
18 | | -} |
19 | | -
|
20 | | -definition usergroup { |
21 | | - relation manager: user | usergroup#member | usergroup#manager |
22 | | - relation direct_member: user | usergroup#member | usergroup#manager |
23 | | -
|
24 | | - permission member = direct_member + manager |
25 | | -} |
26 | | -
|
27 | | -definition organization { |
28 | | - relation group: usergroup |
29 | | - relation administrator: user | usergroup#member | usergroup#manager |
30 | | - relation direct_member: user |
31 | | -
|
32 | | - relation resource: resource |
33 | | -
|
34 | | - permission admin = administrator |
35 | | - permission member = direct_member + administrator + group->member |
36 | | -} |
37 | | -``` |
38 | | - |
39 | | -### user |
40 | | - |
41 | | -`user` is an example of a "user" type, which is used to represent users. The definition itself is empty, as it is only used for referencing purposes. |
42 | | - |
43 | | -```zed |
44 | | -definition user {} |
45 | | -``` |
46 | | - |
47 | | -### resource |
48 | | - |
49 | | -`resource` is the definition used to represent the resource being shared |
50 | | - |
51 | | -```zed |
52 | | -definition resource { |
53 | | - relation manager: user | usergroup#member | usergroup#manager |
54 | | - relation viewer: user | usergroup#member | usergroup#manager |
55 | | -
|
56 | | - permission manage = manager |
57 | | - permission view = viewer + manager |
58 | | -} |
59 | | -``` |
60 | | - |
61 | | -Within the definition, there are defined two relations: `viewer` and `manager`, which are used to represent roles for users _or members/managers of groups_ for the resource, as well as the `view` and `manage` permissions for viewing and managing the resource, respectively. |
62 | | - |
63 | | -### usergroup |
64 | | - |
65 | | -`usergroup` is the definition used to represent groups, which can contain either users or other groups. Groups support a distinction between member and manager. |
66 | | - |
67 | | -```zed |
68 | | -definition usergroup { |
69 | | - relation manager: user | usergroup#member | usergroup#manager |
70 | | - relation direct_member: user | usergroup#member | usergroup#manager |
71 | | -
|
72 | | - permission member = direct_member + manager |
73 | | -} |
74 | | -``` |
75 | | - |
76 | | -### organization |
77 | | - |
78 | | -`organization` is the definition used to represent the overall organization. |
79 | | - |
80 | | -```zed |
81 | | -definition organization { |
82 | | - relation group: usergroup |
83 | | - relation administrator: user | usergroup#member | usergroup#manager |
84 | | - relation direct_member: user |
85 | | -
|
86 | | - relation resource: resource |
87 | | -
|
88 | | - permission admin = administrator |
89 | | - permission member = direct_member + administrator + group->member |
90 | | -} |
91 | | -``` |
92 | | - |
93 | | -Organizations contain four relations (`group`, `resource`, `member`, `administrator`) which are used to reference the groups, resources, direct members and administrator users for the organization. |
94 | | - |
95 | | -#### member permission |
96 | | - |
97 | | -The `member` permission under organization computes the transitive closure of _all_ member users/groups of an organization by combining data from three sources: |
98 | | - |
99 | | -1. `direct_member`: users directly added to the organization as a member |
100 | | -2. `administrator` is used to add any users found as an `administrator` of the organization |
101 | | -3. `group->member` is used to walk from the organization to any of its groups, and then from the `group` to any of its members. This ensure that if a user is available under `member` under any group in the organization, they are treated as a member of the organization as well. |
| 3 | +Access can be granted via direct access, or by being member of a group (that can be a child of another group) that has access to the resource. |
0 commit comments