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
相关产品推荐
相关产品推荐

