-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfirestore.rules
113 lines (97 loc) · 3.08 KB
/
firestore.rules
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// function isAuth() {
// return request.auth != null && request.auth.uid != null;
// }
// rol 4: Invitado (0% acceso)
// rol 3: Usuario (25% acceso)
// rol 2: Moderador (30% acceso)
// rol 1: Editor/Asistente (70% acceso)
// rol 0: Manager (99% acceso)
// rol -1: Desarrollador (Acceso total)
function getRole(uid) {
return uid is string ? get(/databases/$(database)/documents/users/$(uid)).data.role : 4;
}
// user.role = 3
function canUse() {
return getRole(request.auth.uid) < 4
}
// moderator.role = 2
function canModerate() {
return getRole(request.auth.uid) < 3
}
// editor.role = 1
function canEdit() {
return getRole(request.auth.uid) < 2
}
// admin.role = 0
function canAdmin() {
return getRole(request.auth.uid) < 1
}
// developer.role = -1
function canDevelop() {
return getRole(request.auth.uid) < 0
}
function isOwnUser(uid) {
return request.auth.uid == uid;
}
// function isAuthor() {
// return request.auth.uid == resource.data.createdByRef.uid;
// }
match /{document=**} {
// deshabilita el acceso por defecto
allow read, write: if false;
}
match /logs/{id} {
// lectura explicita, desarrolladores
allow read: if canDevelop();
// creacion explicita, cualquiera
allow create: if true;
// modificacion granular, desarrolladores hacia arriba
allow update: if canDevelop();
allow delete: if canDevelop();
}
match /counters/{id} {
// lectura explicita, cualquiera
allow read: if true;
// modificacion granular, editores hacia arriba
allow create: if canEdit();
allow update: if canEdit();
allow delete: if canDevelop();
}
match /instances/{id} {
// lectura explicita, cualquiera
allow read: if true;
// modificacion granular, administradores hacia arriba
allow create: if canDevelop();
allow update: if canAdmin();
allow delete: if canDevelop();
}
match /users/{id} {
// lectura explicita, moderadores hacia arriba
allow read: if canModerate() || isOwnUser(id);
// modificacion granular, administradores hacia arriba
allow create: if canAdmin() || isOwnUser(id);
// administradores no puede modificar desarrolladores
allow update: if canAdmin() || isOwnUser(id);
allow delete: if canAdmin() || isOwnUser(id);
}
match /teachers/{id} {
// lectura explicita, cualquiera
allow read: if true;
// modificacion granular, usuarios hacia arriba
allow create: if canUse();
allow update: if canUse();
allow delete: if canModerate();
}
match /courses/{id} {
// lectura explicita, cualquiera
allow read: if true;
// modificacion granular, usuarios hacia arriba
allow create: if canUse();
allow update: if canUse();
allow delete: if canModerate();
}
}
}