Firebase FireStore 抽象函数不起作用
Firebase FireStore Abstracted function not working
我在 fireStore 中有一个有效的读取规则来检查用户是否在 /accounts/{account} 资源的用户数组中:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /accounts/{account} {
allow read: if request.auth != null && request.auth.token.email in resource.data.users;
}
}
}
为了简化代码并在其他地方使用函数来根据资源 ID 检查用户访问权限,并遵循此 link 中的信息:Security Rules! | Get to know Cloud Firestore #6 19:25 我试图抽象代码:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function hasUserAccess(account){
return request.auth.token.email in get(/databases/$(database)/documents/accounts/$(account)).data.users;
}
match /accounts/{account} {
allow read: if request.auth != null && hasUserAccess(account);
}
}
}
这样当我想交叉引用相关文档的访问时,我可以调用该函数。为什么抽象版本无法工作?根据 youtube 视频,它似乎应该可以正常工作。
您将需要使用 hasAny() 检查用户帐户列表是否包含传递的电子邮件。
另请注意,您必须在函数中传递request.auth.token.email。
请使用以下代码查看用户是否存在于您的其他集合的“用户”字段中:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function hasUserAccess(account,email){
return get(/databases/$(database)/documents/accounts/$(account)).data.users.hasAny([email]);
}
match /accounts/{account} {
allow read: if request.auth != null && hasUserAccess(account, request.auth.token.email);
}
}
}
这行得通,我似乎无法在该函数正在检查的集合中使用该函数?
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function hasUserAccess(account){
return request.auth.token.email in get(/databases/$(database)/documents/accounts/$(account)).data.users;
}
// You can't use the function within this match condition
match /accounts/{account} {
allow read: if request.auth != null && request.auth.token.email in resource.data.users;
}
// You CAN use the function within this match condition as it isn't for the collection /accounts
match /otherData/{account} {
allow read: if request.auth != null && hasUserAccess(account)
}
}
}
我在 fireStore 中有一个有效的读取规则来检查用户是否在 /accounts/{account} 资源的用户数组中:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /accounts/{account} {
allow read: if request.auth != null && request.auth.token.email in resource.data.users;
}
}
}
为了简化代码并在其他地方使用函数来根据资源 ID 检查用户访问权限,并遵循此 link 中的信息:Security Rules! | Get to know Cloud Firestore #6 19:25 我试图抽象代码:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function hasUserAccess(account){
return request.auth.token.email in get(/databases/$(database)/documents/accounts/$(account)).data.users;
}
match /accounts/{account} {
allow read: if request.auth != null && hasUserAccess(account);
}
}
}
这样当我想交叉引用相关文档的访问时,我可以调用该函数。为什么抽象版本无法工作?根据 youtube 视频,它似乎应该可以正常工作。
您将需要使用 hasAny() 检查用户帐户列表是否包含传递的电子邮件。
另请注意,您必须在函数中传递request.auth.token.email。
请使用以下代码查看用户是否存在于您的其他集合的“用户”字段中:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function hasUserAccess(account,email){
return get(/databases/$(database)/documents/accounts/$(account)).data.users.hasAny([email]);
}
match /accounts/{account} {
allow read: if request.auth != null && hasUserAccess(account, request.auth.token.email);
}
}
}
这行得通,我似乎无法在该函数正在检查的集合中使用该函数?
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function hasUserAccess(account){
return request.auth.token.email in get(/databases/$(database)/documents/accounts/$(account)).data.users;
}
// You can't use the function within this match condition
match /accounts/{account} {
allow read: if request.auth != null && request.auth.token.email in resource.data.users;
}
// You CAN use the function within this match condition as it isn't for the collection /accounts
match /otherData/{account} {
allow read: if request.auth != null && hasUserAccess(account)
}
}
}