繁体   English   中英

如何在不强制用户注册的情况下保护 Flutter + Firebase 应用程序?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM