@rsconcept/rstool 1.9.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/mappers/model-adapter.d.ts +1 -2
- package/dist/mappers/schema-adapter.d.ts +1 -2
- package/dist/mappers/types.d.ts +4 -5
- package/dist/models/rstool-agent.js +1 -2
- package/dist/session/session-store.d.ts +3 -3
- package/dist/session/session-store.js +1 -2
- package/dist/wrapper/client.d.ts +3 -4
- package/docs/BRIEF.md +93 -0
- package/docs/CONCEPTUAL-SCHEMA.md +16 -1
- package/docs/CONSTRUCTIONS.md +14 -2
- package/docs/DIAGNOSTICS.md +3 -2
- package/docs/DOMAIN.md +12 -0
- package/docs/METHOD.md +208 -0
- package/docs/PORTAL-API.md +38 -285
- package/docs/PORTAL-MODELS.md +24 -0
- package/docs/PORTAL-OSS.md +56 -0
- package/docs/PORTAL-PUBLISH.md +39 -0
- package/docs/PORTAL-READ.md +301 -0
- package/docs/README.md +7 -4
- package/docs/REQUIREMENTS.md +61 -0
- package/docs/SYNTAX.md +4 -3
- package/docs/TYPIFICATION.md +1 -1
- package/docs/brief.schema.json +173 -0
- package/examples/README.md +16 -2
- package/examples/access-control/NOTES.md +23 -0
- package/examples/access-control/anti/collapsed.json +439 -0
- package/examples/access-control/anti/weakened.json +439 -0
- package/examples/access-control/brief-v1.json +231 -0
- package/examples/access-control/brief.json +310 -0
- package/examples/access-control/build-rsform.ts +151 -0
- package/examples/access-control/requirements-v1.md +9 -0
- package/examples/access-control/requirements-v2.md +4 -0
- package/examples/access-control/rsform-session-v1.json +439 -0
- package/examples/access-control/rsform-session.json +523 -0
- package/examples/audit-diagnostics.ts +9 -1
- package/examples/briefs.test.ts +126 -0
- package/examples/clinic-booking/NOTES.md +24 -0
- package/examples/clinic-booking/anti/collapsed.json +615 -0
- package/examples/clinic-booking/anti/species-as-genus.json +568 -0
- package/examples/clinic-booking/brief-v1.json +332 -0
- package/examples/clinic-booking/brief.json +405 -0
- package/examples/clinic-booking/build-rsform.ts +174 -0
- package/examples/clinic-booking/requirements-v1.md +9 -0
- package/examples/clinic-booking/requirements-v2.md +4 -0
- package/examples/clinic-booking/rsform-session-v1.json +615 -0
- package/examples/clinic-booking/rsform-session.json +700 -0
- package/examples/diagnostics-utils.ts +26 -0
- package/examples/kinship/brief.json +337 -0
- package/examples/kinship/build-rsform.ts +7 -4
- package/examples/kinship/rsform-session.json +20 -63
- package/examples/kinship/rsmodel-session.json +14 -14
- package/examples/kinship-subordination/NOTES.md +49 -0
- package/examples/kinship-subordination/brief.json +161 -0
- package/examples/kinship-subordination/build-rsform.ts +100 -0
- package/examples/kinship-subordination/rsform-session.json +795 -0
- package/examples/library-loans/NOTES.md +46 -0
- package/examples/library-loans/anti/collapsed.json +481 -0
- package/examples/library-loans/anti/species-as-genus.json +334 -0
- package/examples/library-loans/anti/uncovered.json +406 -0
- package/examples/library-loans/anti/weakened.json +464 -0
- package/examples/library-loans/brief-v1.json +340 -0
- package/examples/library-loans/brief.json +502 -0
- package/examples/library-loans/build-rsform.ts +239 -0
- package/examples/library-loans/requirements-v1.md +11 -0
- package/examples/library-loans/requirements-v2.md +5 -0
- package/examples/library-loans/rsform-session-v1.json +481 -0
- package/examples/library-loans/rsform-session.json +652 -0
- package/examples/library-loans/source-markup.md +18 -0
- package/examples/movd/brief.json +220 -0
- package/examples/movd/build-rsform.ts +5 -2
- package/examples/movd/rsform-session.json +14 -46
- package/examples/subordination/NOTES.md +59 -0
- package/examples/subordination/anti/collapsed.json +556 -0
- package/examples/subordination/anti/single-relation.json +125 -0
- package/examples/subordination/anti/transitive.json +573 -0
- package/examples/subordination/anti/weakened.json +539 -0
- package/examples/subordination/brief.json +386 -0
- package/examples/subordination/build-rsform.ts +63 -0
- package/examples/subordination/constants.ts +115 -0
- package/examples/subordination/rsform-session.json +556 -0
- package/examples/subordination/source-markup.md +19 -0
- package/examples/subordination/source.md +40 -0
- package/package.json +18 -10
- package/skills/INSTALL.md +28 -29
- package/skills/README.md +25 -10
- package/skills/rs-core/SKILL.md +56 -0
- package/skills/rs-explain/SKILL.md +28 -0
- package/skills/rs-explicate/SKILL.md +71 -0
- package/skills/rs-interpret/SKILL.md +67 -0
- package/skills/rs-portal/SKILL.md +51 -0
- package/skills/rs-review/SKILL.md +79 -0
- package/skills/rs-scope/SKILL.md +67 -0
- package/skills/rs-synthesis/SKILL.md +52 -0
- package/skills/rstool/SKILL.md +70 -0
- package/skills/rstool-helper/GUIDE.md +18 -299
- package/skills/rstool-helper/SKILL.md +8 -58
- package/skills/{rstool-helper → rstool-runtime}/EXAMPLES.md +16 -12
- package/skills/{rstool-helper → rstool-runtime}/REFERENCE.md +7 -5
- package/skills/rstool-runtime/SKILL.md +96 -0
- package/skills/scripts/brief-check.test.ts +165 -0
- package/skills/scripts/brief-check.ts +826 -0
- package/skills/scripts/check-brief.ts +94 -0
- package/skills/scripts/rstool-skills.mjs +119 -0
- package/skills/scripts/skill-stubs.test.ts +48 -0
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
{
|
|
2
|
+
"contractVersion": "3.3.0",
|
|
3
|
+
"state": {
|
|
4
|
+
"sessionId": "86dcdcd7-c202-42d2-9c8d-57f1e8388cc0",
|
|
5
|
+
"alias": "RBAC",
|
|
6
|
+
"title": "Антипример: weakened",
|
|
7
|
+
"comment": "Ролевое управление доступом. Эксплицировать роли, иерархию и эффективные права для проектирования подсистемы доступа и проверок при назначении ролей.\nL1. Исключено: журнал изменений и сроки хранения (п. 6); невыразимо: кто и когда выдал право, права на прошлую дату.\nL2. Исключено: аутентификация (п. 7); невыразимо: способ входа, учётная запись SSO.\nL3. Исключено: ресурсы как объекты: право — неделимый элемент; невыразимо: права на конкретный документ.\nDC1. иерархия ролей: отношение S3 — п. 2; роль может входить в несколько старших — дерево избыточно ограничивает.\nDC2. права пользователя: вывод через роли (F5, F6) — права пользователя не задаются отдельно — иначе разойдутся с ролями.\nDC3. разделение обязанностей: по эффективным ролям (A2) — п. 4: «в том числе через иерархию».\nDC4. симметричность несовместимости: без аксиомы — A2 запрещает пару в любом порядке; достаточно записать пару один раз.\nDC5. ацикличность иерархии: аксиома A1 через замыкание F1 — п. 2.",
|
|
8
|
+
"createdAt": "2026-10-25T18:34:35.451Z",
|
|
9
|
+
"updatedAt": "2026-10-25T18:34:35.455Z",
|
|
10
|
+
"revisions": [
|
|
11
|
+
{
|
|
12
|
+
"revisionId": "1aab62b6-8e68-4aa9-8e40-e55faf471229",
|
|
13
|
+
"at": "2026-10-25T18:34:35.455Z",
|
|
14
|
+
"message": "Антипример: weakened: шаг 1"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"items": [
|
|
18
|
+
{
|
|
19
|
+
"id": 1,
|
|
20
|
+
"alias": "X1",
|
|
21
|
+
"cstType": "basic",
|
|
22
|
+
"definitionFormal": "",
|
|
23
|
+
"term": "пользователи",
|
|
24
|
+
"definitionText": "",
|
|
25
|
+
"convention": "Учётные записи пользователей системы.",
|
|
26
|
+
"analysis": {
|
|
27
|
+
"success": true,
|
|
28
|
+
"type": {
|
|
29
|
+
"typeID": 5,
|
|
30
|
+
"base": {
|
|
31
|
+
"typeID": 3,
|
|
32
|
+
"baseID": "X1"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"valueClass": "value",
|
|
36
|
+
"diagnostics": []
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": 2,
|
|
41
|
+
"alias": "X2",
|
|
42
|
+
"cstType": "basic",
|
|
43
|
+
"definitionFormal": "",
|
|
44
|
+
"term": "роли",
|
|
45
|
+
"definitionText": "",
|
|
46
|
+
"convention": "Роли доступа (администратор, редактор, …).",
|
|
47
|
+
"analysis": {
|
|
48
|
+
"success": true,
|
|
49
|
+
"type": {
|
|
50
|
+
"typeID": 5,
|
|
51
|
+
"base": {
|
|
52
|
+
"typeID": 3,
|
|
53
|
+
"baseID": "X2"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"valueClass": "value",
|
|
57
|
+
"diagnostics": []
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": 3,
|
|
62
|
+
"alias": "X3",
|
|
63
|
+
"cstType": "basic",
|
|
64
|
+
"definitionFormal": "",
|
|
65
|
+
"term": "права",
|
|
66
|
+
"definitionText": "",
|
|
67
|
+
"convention": "Элементарные права: действие над видом ресурса (чтение документов, …).",
|
|
68
|
+
"analysis": {
|
|
69
|
+
"success": true,
|
|
70
|
+
"type": {
|
|
71
|
+
"typeID": 5,
|
|
72
|
+
"base": {
|
|
73
|
+
"typeID": 3,
|
|
74
|
+
"baseID": "X3"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"valueClass": "value",
|
|
78
|
+
"diagnostics": []
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"id": 4,
|
|
83
|
+
"alias": "S1",
|
|
84
|
+
"cstType": "structure",
|
|
85
|
+
"definitionFormal": "ℬ(X1×X2)",
|
|
86
|
+
"term": "назначения ролей",
|
|
87
|
+
"definitionText": "",
|
|
88
|
+
"convention": "Пара (пользователь, роль): роль назначена пользователю напрямую.",
|
|
89
|
+
"analysis": {
|
|
90
|
+
"success": true,
|
|
91
|
+
"type": {
|
|
92
|
+
"typeID": 5,
|
|
93
|
+
"base": {
|
|
94
|
+
"typeID": 4,
|
|
95
|
+
"factors": [
|
|
96
|
+
{
|
|
97
|
+
"typeID": 3,
|
|
98
|
+
"baseID": "X1"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"typeID": 3,
|
|
102
|
+
"baseID": "X2"
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
"valueClass": "value",
|
|
108
|
+
"diagnostics": []
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"id": 5,
|
|
113
|
+
"alias": "S2",
|
|
114
|
+
"cstType": "structure",
|
|
115
|
+
"definitionFormal": "ℬ(X2×X3)",
|
|
116
|
+
"term": "права роли",
|
|
117
|
+
"definitionText": "",
|
|
118
|
+
"convention": "Пара (роль, право): право дано роли напрямую.",
|
|
119
|
+
"analysis": {
|
|
120
|
+
"success": true,
|
|
121
|
+
"type": {
|
|
122
|
+
"typeID": 5,
|
|
123
|
+
"base": {
|
|
124
|
+
"typeID": 4,
|
|
125
|
+
"factors": [
|
|
126
|
+
{
|
|
127
|
+
"typeID": 3,
|
|
128
|
+
"baseID": "X2"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"typeID": 3,
|
|
132
|
+
"baseID": "X3"
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"valueClass": "value",
|
|
138
|
+
"diagnostics": []
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"id": 6,
|
|
143
|
+
"alias": "S3",
|
|
144
|
+
"cstType": "structure",
|
|
145
|
+
"definitionFormal": "ℬ(X2×X2)",
|
|
146
|
+
"term": "иерархия ролей",
|
|
147
|
+
"definitionText": "",
|
|
148
|
+
"convention": "Пара (старшая, младшая): старшая роль включает права младшей.",
|
|
149
|
+
"analysis": {
|
|
150
|
+
"success": true,
|
|
151
|
+
"type": {
|
|
152
|
+
"typeID": 5,
|
|
153
|
+
"base": {
|
|
154
|
+
"typeID": 4,
|
|
155
|
+
"factors": [
|
|
156
|
+
{
|
|
157
|
+
"typeID": 3,
|
|
158
|
+
"baseID": "X2"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"typeID": 3,
|
|
162
|
+
"baseID": "X2"
|
|
163
|
+
}
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
"valueClass": "value",
|
|
168
|
+
"diagnostics": []
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": 7,
|
|
173
|
+
"alias": "S4",
|
|
174
|
+
"cstType": "structure",
|
|
175
|
+
"definitionFormal": "ℬ(X2×X2)",
|
|
176
|
+
"term": "несовместимые роли",
|
|
177
|
+
"definitionText": "",
|
|
178
|
+
"convention": "Пара ролей, которые нельзя иметь одному пользователю (разделение обязанностей).",
|
|
179
|
+
"analysis": {
|
|
180
|
+
"success": true,
|
|
181
|
+
"type": {
|
|
182
|
+
"typeID": 5,
|
|
183
|
+
"base": {
|
|
184
|
+
"typeID": 4,
|
|
185
|
+
"factors": [
|
|
186
|
+
{
|
|
187
|
+
"typeID": 3,
|
|
188
|
+
"baseID": "X2"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"typeID": 3,
|
|
192
|
+
"baseID": "X2"
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
"valueClass": "value",
|
|
198
|
+
"diagnostics": []
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"id": 8,
|
|
203
|
+
"alias": "F1",
|
|
204
|
+
"cstType": "function",
|
|
205
|
+
"definitionFormal": "[ρ∈X2] R{σ:=Pr2(Fi1[{ρ}](S3)) | σ∪Pr2(Fi1[σ](S3))}",
|
|
206
|
+
"term": "младшие роли",
|
|
207
|
+
"definitionText": "Роли, которые данная роль включает напрямую или через цепочку.",
|
|
208
|
+
"convention": "",
|
|
209
|
+
"analysis": {
|
|
210
|
+
"success": true,
|
|
211
|
+
"type": {
|
|
212
|
+
"typeID": 7,
|
|
213
|
+
"result": {
|
|
214
|
+
"typeID": 5,
|
|
215
|
+
"base": {
|
|
216
|
+
"typeID": 3,
|
|
217
|
+
"baseID": "X2"
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
"args": [
|
|
221
|
+
{
|
|
222
|
+
"alias": "ρ",
|
|
223
|
+
"type": {
|
|
224
|
+
"typeID": 3,
|
|
225
|
+
"baseID": "X2"
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
]
|
|
229
|
+
},
|
|
230
|
+
"valueClass": "value",
|
|
231
|
+
"diagnostics": []
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"id": 9,
|
|
236
|
+
"alias": "F2",
|
|
237
|
+
"cstType": "function",
|
|
238
|
+
"definitionFormal": "[ξ∈X1] Pr2(Fi1[{ξ}](S1))",
|
|
239
|
+
"term": "прямые роли",
|
|
240
|
+
"definitionText": "Роли, назначенные пользователю напрямую.",
|
|
241
|
+
"convention": "",
|
|
242
|
+
"analysis": {
|
|
243
|
+
"success": true,
|
|
244
|
+
"type": {
|
|
245
|
+
"typeID": 7,
|
|
246
|
+
"result": {
|
|
247
|
+
"typeID": 5,
|
|
248
|
+
"base": {
|
|
249
|
+
"typeID": 3,
|
|
250
|
+
"baseID": "X2"
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
"args": [
|
|
254
|
+
{
|
|
255
|
+
"alias": "ξ",
|
|
256
|
+
"type": {
|
|
257
|
+
"typeID": 3,
|
|
258
|
+
"baseID": "X1"
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
]
|
|
262
|
+
},
|
|
263
|
+
"valueClass": "value",
|
|
264
|
+
"diagnostics": []
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"id": 10,
|
|
269
|
+
"alias": "F3",
|
|
270
|
+
"cstType": "function",
|
|
271
|
+
"definitionFormal": "[ξ∈X1] red(I{F1[ρ] | ρ:∈F2[ξ]})\\F2[ξ]",
|
|
272
|
+
"term": "унаследованные роли",
|
|
273
|
+
"definitionText": "Роли, которые пользователь получает только через иерархию.",
|
|
274
|
+
"convention": "",
|
|
275
|
+
"analysis": {
|
|
276
|
+
"success": true,
|
|
277
|
+
"type": {
|
|
278
|
+
"typeID": 7,
|
|
279
|
+
"result": {
|
|
280
|
+
"typeID": 5,
|
|
281
|
+
"base": {
|
|
282
|
+
"typeID": 3,
|
|
283
|
+
"baseID": "X2"
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
"args": [
|
|
287
|
+
{
|
|
288
|
+
"alias": "ξ",
|
|
289
|
+
"type": {
|
|
290
|
+
"typeID": 3,
|
|
291
|
+
"baseID": "X1"
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
]
|
|
295
|
+
},
|
|
296
|
+
"valueClass": "value",
|
|
297
|
+
"diagnostics": []
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"id": 11,
|
|
302
|
+
"alias": "F4",
|
|
303
|
+
"cstType": "function",
|
|
304
|
+
"definitionFormal": "[ξ∈X1] F2[ξ]∪F3[ξ]",
|
|
305
|
+
"term": "эффективные роли",
|
|
306
|
+
"definitionText": "Прямые и унаследованные роли пользователя.",
|
|
307
|
+
"convention": "",
|
|
308
|
+
"analysis": {
|
|
309
|
+
"success": true,
|
|
310
|
+
"type": {
|
|
311
|
+
"typeID": 7,
|
|
312
|
+
"result": {
|
|
313
|
+
"typeID": 5,
|
|
314
|
+
"base": {
|
|
315
|
+
"typeID": 3,
|
|
316
|
+
"baseID": "X2"
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
"args": [
|
|
320
|
+
{
|
|
321
|
+
"alias": "ξ",
|
|
322
|
+
"type": {
|
|
323
|
+
"typeID": 3,
|
|
324
|
+
"baseID": "X1"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
]
|
|
328
|
+
},
|
|
329
|
+
"valueClass": "value",
|
|
330
|
+
"diagnostics": []
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"id": 12,
|
|
335
|
+
"alias": "F5",
|
|
336
|
+
"cstType": "function",
|
|
337
|
+
"definitionFormal": "[ξ∈X1] Pr2(Fi1[F2[ξ]](S2))",
|
|
338
|
+
"term": "назначенные права",
|
|
339
|
+
"definitionText": "Права прямых ролей пользователя.",
|
|
340
|
+
"convention": "",
|
|
341
|
+
"analysis": {
|
|
342
|
+
"success": true,
|
|
343
|
+
"type": {
|
|
344
|
+
"typeID": 7,
|
|
345
|
+
"result": {
|
|
346
|
+
"typeID": 5,
|
|
347
|
+
"base": {
|
|
348
|
+
"typeID": 3,
|
|
349
|
+
"baseID": "X3"
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
"args": [
|
|
353
|
+
{
|
|
354
|
+
"alias": "ξ",
|
|
355
|
+
"type": {
|
|
356
|
+
"typeID": 3,
|
|
357
|
+
"baseID": "X1"
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
]
|
|
361
|
+
},
|
|
362
|
+
"valueClass": "value",
|
|
363
|
+
"diagnostics": []
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
"id": 13,
|
|
368
|
+
"alias": "F6",
|
|
369
|
+
"cstType": "function",
|
|
370
|
+
"definitionFormal": "[ξ∈X1] Pr2(Fi1[F4[ξ]](S2))",
|
|
371
|
+
"term": "эффективные права",
|
|
372
|
+
"definitionText": "Права всех ролей пользователя, включая унаследованные.",
|
|
373
|
+
"convention": "",
|
|
374
|
+
"analysis": {
|
|
375
|
+
"success": true,
|
|
376
|
+
"type": {
|
|
377
|
+
"typeID": 7,
|
|
378
|
+
"result": {
|
|
379
|
+
"typeID": 5,
|
|
380
|
+
"base": {
|
|
381
|
+
"typeID": 3,
|
|
382
|
+
"baseID": "X3"
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
"args": [
|
|
386
|
+
{
|
|
387
|
+
"alias": "ξ",
|
|
388
|
+
"type": {
|
|
389
|
+
"typeID": 3,
|
|
390
|
+
"baseID": "X1"
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
]
|
|
394
|
+
},
|
|
395
|
+
"valueClass": "value",
|
|
396
|
+
"diagnostics": []
|
|
397
|
+
}
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"id": 14,
|
|
401
|
+
"alias": "A1",
|
|
402
|
+
"cstType": "axiom",
|
|
403
|
+
"definitionFormal": "∀ρ∈X2 ρ∉F1[ρ]",
|
|
404
|
+
"term": "иерархия без циклов",
|
|
405
|
+
"definitionText": "Роль не включает саму себя ни напрямую, ни через цепочку.",
|
|
406
|
+
"convention": "",
|
|
407
|
+
"analysis": {
|
|
408
|
+
"success": true,
|
|
409
|
+
"type": {
|
|
410
|
+
"typeID": 6
|
|
411
|
+
},
|
|
412
|
+
"valueClass": "value",
|
|
413
|
+
"diagnostics": []
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
"id": 15,
|
|
418
|
+
"alias": "A2",
|
|
419
|
+
"cstType": "axiom",
|
|
420
|
+
"definitionFormal": "∀ξ∈X1 ∀(α,β)∈S4 ¬(α∈F2[ξ] & β∈F2[ξ])",
|
|
421
|
+
"term": "разделение обязанностей",
|
|
422
|
+
"definitionText": "Ни у одного пользователя нет обеих ролей несовместимой пары, в том числе через иерархию.",
|
|
423
|
+
"convention": "",
|
|
424
|
+
"analysis": {
|
|
425
|
+
"success": true,
|
|
426
|
+
"type": {
|
|
427
|
+
"typeID": 6
|
|
428
|
+
},
|
|
429
|
+
"valueClass": "value",
|
|
430
|
+
"diagnostics": []
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
],
|
|
434
|
+
"model": {
|
|
435
|
+
"items": []
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
"diagnostics": []
|
|
439
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"status": "confirmed",
|
|
4
|
+
"approach": "project",
|
|
5
|
+
"object": "Ролевое управление доступом",
|
|
6
|
+
"task": "Эксплицировать роли, иерархию и эффективные права для проектирования подсистемы доступа и проверок при назначении ролей",
|
|
7
|
+
"source": "requirements-v1.md",
|
|
8
|
+
"restrictions": [
|
|
9
|
+
{
|
|
10
|
+
"id": "L1",
|
|
11
|
+
"excludes": "журнал изменений и сроки хранения (п. 6)",
|
|
12
|
+
"inexpressible": ["кто и когда выдал право", "права на прошлую дату"]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "L2",
|
|
16
|
+
"excludes": "аутентификация (п. 7)",
|
|
17
|
+
"inexpressible": ["способ входа", "учётная запись SSO"]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "L3",
|
|
21
|
+
"excludes": "ресурсы как объекты: право — неделимый элемент",
|
|
22
|
+
"inexpressible": ["права на конкретный документ"]
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"expressiveness": [
|
|
26
|
+
{
|
|
27
|
+
"id": "E1",
|
|
28
|
+
"concept": "младшие роли (замыкание иерархии)",
|
|
29
|
+
"ref": "п. 2",
|
|
30
|
+
"via": "замыкание S3 через R{}",
|
|
31
|
+
"constituent": "F1"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "E2",
|
|
35
|
+
"concept": "прямые роли пользователя",
|
|
36
|
+
"ref": "п. 3",
|
|
37
|
+
"via": "фильтр назначений",
|
|
38
|
+
"constituent": "F2"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "E3",
|
|
42
|
+
"concept": "унаследованные роли пользователя",
|
|
43
|
+
"ref": "п. 5",
|
|
44
|
+
"via": "объединение младших ролей прямых ролей минус прямые",
|
|
45
|
+
"constituent": "F3"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "E4",
|
|
49
|
+
"concept": "назначенные права",
|
|
50
|
+
"ref": "п. 3",
|
|
51
|
+
"via": "права прямых ролей",
|
|
52
|
+
"constituent": "F5"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "E5",
|
|
56
|
+
"concept": "эффективные права",
|
|
57
|
+
"ref": "п. 3",
|
|
58
|
+
"via": "права прямых и унаследованных ролей",
|
|
59
|
+
"constituent": "F6"
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"distinctions": [
|
|
63
|
+
{
|
|
64
|
+
"id": "V1",
|
|
65
|
+
"between": ["E4", "E5"],
|
|
66
|
+
"text": "назначенные права ≠ эффективные",
|
|
67
|
+
"witness": "SC1"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "V2",
|
|
71
|
+
"between": ["E2", "E3"],
|
|
72
|
+
"text": "прямая роль ≠ унаследованная",
|
|
73
|
+
"witness": "SC1"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"invariants": [
|
|
77
|
+
{
|
|
78
|
+
"id": "I1",
|
|
79
|
+
"text": "В иерархии ролей нет циклов",
|
|
80
|
+
"ref": "п. 2",
|
|
81
|
+
"constituent": "A1",
|
|
82
|
+
"positive": "SC1",
|
|
83
|
+
"negative": "SC2"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "I2",
|
|
87
|
+
"text": "Нет пользователя с обеими ролями несовместимой пары, в том числе через иерархию",
|
|
88
|
+
"ref": "п. 4",
|
|
89
|
+
"constituent": "A2",
|
|
90
|
+
"positive": "SC1",
|
|
91
|
+
"negative": "SC3"
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"decisions": [
|
|
95
|
+
{
|
|
96
|
+
"id": "DC1",
|
|
97
|
+
"topic": "иерархия ролей",
|
|
98
|
+
"alternatives": ["плоские роли без иерархии", "дерево: у роли одна старшая", "отношение S3 (старшая, младшая)"],
|
|
99
|
+
"choice": "отношение S3",
|
|
100
|
+
"rationale": "п. 2; роль может входить в несколько старших — дерево избыточно ограничивает"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"id": "DC2",
|
|
104
|
+
"topic": "права пользователя",
|
|
105
|
+
"alternatives": ["структура «права пользователя» S#", "вывод через роли"],
|
|
106
|
+
"choice": "вывод через роли (F5, F6)",
|
|
107
|
+
"rationale": "права пользователя не задаются отдельно — иначе разойдутся с ролями"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "DC3",
|
|
111
|
+
"topic": "разделение обязанностей",
|
|
112
|
+
"alternatives": ["по прямым ролям", "по эффективным ролям"],
|
|
113
|
+
"choice": "по эффективным ролям (A2)",
|
|
114
|
+
"rationale": "п. 4: «в том числе через иерархию»"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"id": "DC4",
|
|
118
|
+
"topic": "симметричность несовместимости",
|
|
119
|
+
"choice": "без аксиомы",
|
|
120
|
+
"rationale": "A2 запрещает пару в любом порядке; достаточно записать пару один раз"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "DC5",
|
|
124
|
+
"topic": "ацикличность иерархии",
|
|
125
|
+
"choice": "аксиома A1 через замыкание F1",
|
|
126
|
+
"rationale": "п. 2"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"scenarios": [
|
|
130
|
+
{
|
|
131
|
+
"id": "SC1",
|
|
132
|
+
"title": "Администратор и наблюдатель-аудитор",
|
|
133
|
+
"values": {
|
|
134
|
+
"X1": ["ann", "bob"],
|
|
135
|
+
"X2": ["admin", "editor", "viewer", "auditor"],
|
|
136
|
+
"X3": ["read", "write", "delete", "audit"],
|
|
137
|
+
"S1": [
|
|
138
|
+
["ann", "admin"],
|
|
139
|
+
["bob", "viewer"],
|
|
140
|
+
["bob", "auditor"]
|
|
141
|
+
],
|
|
142
|
+
"S2": [
|
|
143
|
+
["viewer", "read"],
|
|
144
|
+
["editor", "write"],
|
|
145
|
+
["admin", "delete"],
|
|
146
|
+
["auditor", "audit"]
|
|
147
|
+
],
|
|
148
|
+
"S3": [
|
|
149
|
+
["admin", "editor"],
|
|
150
|
+
["editor", "viewer"]
|
|
151
|
+
],
|
|
152
|
+
"S4": [["admin", "auditor"]]
|
|
153
|
+
},
|
|
154
|
+
"expect": [
|
|
155
|
+
{
|
|
156
|
+
"of": "F1",
|
|
157
|
+
"args": ["admin"],
|
|
158
|
+
"value": ["editor", "viewer"]
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"of": "F3",
|
|
162
|
+
"args": ["ann"],
|
|
163
|
+
"value": ["editor", "viewer"]
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"of": "F3",
|
|
167
|
+
"args": ["bob"],
|
|
168
|
+
"value": []
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"of": "F5",
|
|
172
|
+
"args": ["ann"],
|
|
173
|
+
"value": ["delete"]
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"of": "F6",
|
|
177
|
+
"args": ["ann"],
|
|
178
|
+
"value": ["read", "write", "delete"]
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"of": "F6",
|
|
182
|
+
"args": ["bob"],
|
|
183
|
+
"value": ["read", "audit"]
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"id": "SC2",
|
|
189
|
+
"title": "Цикл в иерархии",
|
|
190
|
+
"base": "SC1",
|
|
191
|
+
"values": {
|
|
192
|
+
"S3": [
|
|
193
|
+
["admin", "editor"],
|
|
194
|
+
["editor", "viewer"],
|
|
195
|
+
["viewer", "admin"]
|
|
196
|
+
]
|
|
197
|
+
},
|
|
198
|
+
"expect": [
|
|
199
|
+
{
|
|
200
|
+
"of": "A1",
|
|
201
|
+
"holds": false
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"id": "SC3",
|
|
207
|
+
"title": "Несовместимость через наследование",
|
|
208
|
+
"base": "SC1",
|
|
209
|
+
"values": {
|
|
210
|
+
"S1": [
|
|
211
|
+
["ann", "admin"],
|
|
212
|
+
["ann", "auditor"]
|
|
213
|
+
],
|
|
214
|
+
"S4": [["editor", "auditor"]]
|
|
215
|
+
},
|
|
216
|
+
"expect": [
|
|
217
|
+
{
|
|
218
|
+
"of": "A2",
|
|
219
|
+
"holds": false
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"of": "F2",
|
|
223
|
+
"args": ["ann"],
|
|
224
|
+
"value": ["admin", "auditor"]
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
}
|
|
228
|
+
],
|
|
229
|
+
"assumptions": ["право — неделимый элемент, без привязки к конкретному ресурсу"],
|
|
230
|
+
"openQuestions": []
|
|
231
|
+
}
|