-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfirestore.rules
More file actions
119 lines (103 loc) · 4.89 KB
/
Copy pathfirestore.rules
File metadata and controls
119 lines (103 loc) · 4.89 KB
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
114
115
116
117
118
119
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// -----------------------------------------------------------------------
// FUNÇÕES AUXILIARES
// -----------------------------------------------------------------------
// Verifica se a requisição é de um usuário autenticado
function isAuthenticated() {
return request.auth != null;
}
// Verifica se o usuário autenticado é administrador mestre ou tem flag isAdmin
function isAdmin() {
return isAuthenticated() && (
request.auth.token.email == 'teste@tese.com' ||
(exists(/databases/$(database)/documents/users/$(request.auth.uid)) &&
get(/databases/$(database)/documents/users/$(request.auth.uid)).data.isAdmin == true)
);
}
// Verifica se o UID do solicitante coincide com o dono do recurso (ownerID)
function isOwner(ownerUid) {
return isAuthenticated() && request.auth.uid == ownerUid;
}
// -----------------------------------------------------------------------
// COLEÇÃO: users
// Isolamento: cada usuário acessa apenas seu próprio documento.
// -----------------------------------------------------------------------
match /users/{userId} {
// Leitura: próprio usuário ou admin
allow read: if isOwner(userId) || isAdmin();
// Criação: somente o próprio usuário cria o próprio perfil
allow create: if isAuthenticated() && request.auth.uid == userId;
// Atualização: próprio usuário (não pode promover a admin) ou admin (irrestrito)
allow update: if isAdmin() || (
isOwner(userId) &&
!request.resource.data.diff(resource.data).affectedKeys().hasAny(['isAdmin', 'plan', 'status'])
);
allow delete: if isAdmin();
}
// -----------------------------------------------------------------------
// COLEÇÃO: questionnaires
// Chave do documento == UID do usuário → isolamento automático.
// -----------------------------------------------------------------------
match /questionnaires/{userId} {
allow read, write: if isOwner(userId) || isAdmin();
}
// -----------------------------------------------------------------------
// COLEÇÃO: tasks
// Chave do documento == UID do usuário → isolamento automático.
// -----------------------------------------------------------------------
match /tasks/{userId} {
allow read, write: if isOwner(userId) || isAdmin();
}
// -----------------------------------------------------------------------
// COLEÇÃO: access_logs
// Criação: usuário só cria log com seu próprio UID.
// Leitura: apenas admins (trilha de auditoria LGPD).
// -----------------------------------------------------------------------
match /access_logs/{logId} {
allow create: if isAuthenticated() &&
request.resource.data.userId == request.auth.uid;
allow read: if isAdmin();
allow update, delete: if false; // logs são imutáveis
}
// -----------------------------------------------------------------------
// COLEÇÃO: audit_logs
// Gerenciados exclusivamente por admins; imutáveis para usuários.
// -----------------------------------------------------------------------
match /audit_logs/{logId} {
allow read, write: if isAdmin();
}
// -----------------------------------------------------------------------
// COLEÇÃO: support_tickets
// Usuário vê/edita apenas os seus próprios tickets.
// Admin vê e gerencia todos.
// -----------------------------------------------------------------------
match /support_tickets/{ticketId} {
allow create: if isAuthenticated() &&
request.resource.data.userId == request.auth.uid;
allow read: if isAdmin() ||
(isAuthenticated() && resource.data.userId == request.auth.uid);
allow update: if isAdmin() ||
(isAuthenticated() && resource.data.userId == request.auth.uid);
allow delete: if isAdmin();
}
// -----------------------------------------------------------------------
// COLEÇÃO: subscriptions
// Usuário lê apenas sua assinatura; escritas somente por admin
// (ou Cloud Functions via Service Account).
// -----------------------------------------------------------------------
match /subscriptions/{subId} {
allow read: if isAdmin() ||
(isAuthenticated() && resource.data.userId == request.auth.uid);
allow write: if isAdmin();
}
// -----------------------------------------------------------------------
// BLOQUEIO GLOBAL
// Qualquer coleção não listada acima é negada por padrão.
// -----------------------------------------------------------------------
match /{document=**} {
allow read, write: if false;
}
}
}