[英]How to secure Flutter + Firebase app without forcing users to register?
我需要创建一个将在学校使用的 Flutter 应用程序。 粗略的想法是,父母可以通过输入自己的个人 ID 和孩子的个人 ID 来查看有关他们孩子的某些数据。 在数据库中,我将有一个包含孩子的表,一个包含父母的表,以及一个将 parent_id 连接到 child_id 的表。 最后一个表将用作检查哪个父项可以访问哪个子项的数据的机制。
在我们国家,个人 ID 是高度敏感的数据,如果我要将它存储在任何地方,我需要一个好的安全解决方案。 有人可以推荐在 Flutter 端和 Firebase 端实施安全性的最佳实践吗?
如果不是绝对必要的话,我不想让我的用户注册和登录,我宁愿让应用程序保持简单,只有两个字段和一个按钮。
编辑:当然,我可以使用另一种类型的 ID,这样可以降低敏感数据泄露的风险,但这会迫使用户记住更多无用的数字数组。
以下是有用的列表 function 可帮助您更轻松地编写 Firestore 安全规则:
// MARK - Funcs --------------------------------------------------------
function currentUser() {
return request.auth;
}
function isEmailVerified() {
return request.auth.token.email_verified;
}
function isLoggedIn() {
return currentUser() != null;
}
function isCurrentUser(userID) {
return isLoggedIn() && currentUser().uid == userID;
}
function currentUserRef() {
return /databases/$(database)/documents/users/$(currentUser().uid);
}
function userRef(userID) {
return /databases/$(database)/documents/users/$(userID);
}
function existingDataID() {
return resource.id;
}
function existingData() {
return resource.data;
}
function incomingDataID() {
return request.resource.id;
}
function incomingData() {
return request.resource.data;
}
function isChanged(property) {
return incomingData()[property] != existingData()[property];
}
function isNull(property) {
return incomingData()[property] == null;
}
function isNotNull(property) {
return incomingData()[property] != null;
}
function isList(property) {
return incomingData()[property] is list;
}
function isString(property) {
return incomingData()[property] is string;
}
function isNumber(property) {
return incomingData()[property] is number;
}
function isBool(property) {
return incomingData()[property] is bool;
}
function isMap(property) {
return incomingData()[property] is map;
}
function isTimestamp(property) {
return incomingData()[property] is timestamp;
}
function isPath(property) {
return incomingData()[property] is path;
}
function minSize(property, value) {
return incomingData()[property].size() >= value;
}
function maxSize(property, value) {
return incomingData()[property].size() <= value;
}
function maxlength(property, value) {
return incomingData()[property].size() <= value;
}
function minlength(property, value) {
return incomingData()[property].size() >= value;
}
function max(property, value) {
return incomingData()[property] <= value;
}
function min(property, value) {
return incomingData()[property] >= value;
}
然后用它们来保护 collections
match /users/{userID} {
// USE THIS isValidData() WHEN TO VERIFY DATA COMING IN TO FIRESTORE
function isValidData() {
return isCurrentUser(incomingDataID()) &&
(isNotNull('name') && isString('name')) &&
(isNotNull('email') && isString('email')) &&
{... all other data in the document ...} &&
(isNotNull('createdAt') && isTimestamp('createdAt')) &&
(isNotNull('updatedAt') && isTimestamp('updatedAt'));
}
allow read: if isLoggedIn();
allow write: if isValidData();
}
基本概念,但可以在此基础上构建。 如果我知道模型及其设置方式,可以给出更好的答案。 根据您所说的,您可以检查传入的用户 ID 是否在子文档的父列表中,例如查看父是否可以访问子文档(如果有意义的话)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.