You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase用户积分初始化及安全增减实现方案问询(零预算)

零预算实现Firebase用户积分安全管理方案

一、确保新用户points初始值为0

利用Firebase安全规则强制新用户文档创建时points必须为0,且仅允许用户操作自己的文档:

Firestore安全规则示例

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // Users集合规则
    match /Users/{userId} {
      allow create: if request.auth != null && request.auth.uid == userId
                    && request.resource.data.points == 0
                    && request.resource.data.username is string;
      allow update: if request.auth != null && request.auth.uid == userId;
    }
  }
}
  • create规则限制:仅用户本人能创建自己的文档,且points必须设为0,同时校验username为字符串类型
  • 现有老用户文档不受影响,规则仅针对新创建的文档生效

二、安全增加积分

在安全规则中限制points的更新只能是递增操作,且增加值为正整数,防止恶意篡改:

更新上述allow update规则:

allow update: if request.auth != null && request.auth.uid == userId
              && request.resource.data.points > resource.data.points
              && request.resource.data.points is int;
  • 确保每次更新后的points值大于更新前,且为整数,避免恶意减少或设置异常值
  • 若有单次积分获取上限(比如最多加5分),可追加条件:request.resource.data.points - resource.data.points <= 5

三、安全扣除积分兑换代金券

通过批量原子操作实现“创建代金券+扣除积分”的联动,同时用安全规则校验积分足够且扣除数值合规:

应用端批量操作示例(Android)

// 假设兑换一张代金券需扣除10积分
val batch = db.batch()

// 1. 更新用户积分:扣除10分
val userRef = db.collection("Users").document(FirebaseAuth.getInstance().currentUser!!.uid)
batch.update(userRef, "points", FieldValue.increment(-10))

// 2. 创建代金券文档
val voucherRef = db.collection("Vouchers").document()
batch.set(voucherRef, hashMapOf(
    "UserID" to FirebaseAuth.getInstance().currentUser!!.uid,
    "Status" to "Valid"
))

// 执行批量操作
batch.commit().addOnSuccessListener {
    // 操作成功逻辑
}.addOnFailureListener {
    // 操作失败逻辑
}

配套安全规则补充

// Vouchers集合规则
match /Vouchers/{voucherId} {
  allow create: if request.auth != null 
                && request.resource.data.UserID == request.auth.uid
                && request.resource.data.Status == "Valid";
}

// 更新Users的积分扣除规则
match /Users/{userId} {
  allow update: if request.auth != null && request.auth.uid == userId
                // 允许积分增加或合规扣除
                && (
                    (request.resource.data.points > resource.data.points && request.resource.data.points is int)
                    ||
                    (request.resource.data.points == resource.data.points - 10 
                     && resource.data.points >= 10 
                     && request.resource.data.points is int)
                );
}
  • 批量操作是原子的:要么积分扣除和代金券创建都成功,要么都失败,避免数据不一致
  • 规则校验:扣除积分时必须正好减10,且用户当前积分足够(>=10),同时代金券只能由用户本人创建,初始状态为Valid

关键说明

  • 所有规则均基于Firebase免费 tier 可用功能,无需升级到pay-as-you-go
  • 现有用户的积分数据不会被规则影响,仅对新操作生效
  • 若后续有其他积分变动场景(比如扣除不同分值),可扩展规则中的数值条件,或用自定义字段传递扣除值并校验合法性

内容的提问来源于stack exchange,提问作者m.yday

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:22:13