如何对接Firebase Realtime Database校验管理员专属QR码实现动态权限跳转
扫码校验对接Firebase Realtime Database 实现方案
改造思路
移除代码中硬编码的固定校验码,扫描拿到QR码内容后,直接到Firebase数据库的校验码节点查询该内容是否存在,存在则跳转高权限页面,不存在则提示无效。后续人员变动时仅需在Firebase控制台增删对应校验码即可,无需修改APP代码。
前置准备
- 已在Android项目中集成Firebase Realtime Database SDK,app模块build.gradle中已添加依赖:
implementation 'com.google.firebase:firebase-database:20.3.0' - 已将Firebase项目配置文件
google-services.json放入app模块根目录 - Firebase数据库中已新建
valid_admin_qr_codes节点,所有有效管理员校验码直接存为该节点下的子键,值可设为true即可
修改后完整代码
public class BarcodeScanner extends AppCompatActivity { private CodeScanner mCodeScanner; // 移除硬编码的固定校验码,新增Firebase数据库引用 private DatabaseReference mValidAdminCodesRef; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_barcode_scanner); // 初始化Firebase数据库校验码节点引用,节点名和你数据库实际命名保持一致即可 mValidAdminCodesRef = FirebaseDatabase.getInstance().getReference("valid_admin_qr_codes"); CodeScannerView scannerView = findViewById(R.id.scanner_view); mCodeScanner = new CodeScanner(this, scannerView); mCodeScanner.setDecodeCallback(new DecodeCallback () { @Override public void onDecoded(@NonNull final Result result) { BarcodeScanner.this.runOnUiThread(new Runnable() { @Override public void run() { String codeFromScanner = result.getText().trim(); // 查询该扫码内容是否存在于校验码节点中 mValidAdminCodesRef.child(codeFromScanner).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if(snapshot.exists()){ // 校验通过,跳转管理员页面 redirectToNewActivity(); }else{ Toast.makeText(BarcodeScanner.this, "QRCode Tidak Dapat di Gunakan", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(BarcodeScanner.this, "校验失败,请重试:"+error.getMessage(), Toast.LENGTH_SHORT).show(); } }); } }); } }); scannerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCodeScanner.startPreview(); } }); } private void redirectToNewActivity() { startActivity(new Intent(getApplicationContext(), AdminUID.class)); finish(); } @Override protected void onResume() { super.onResume(); mCodeScanner.startPreview(); } @Override protected void onPause() { mCodeScanner.releaseResources(); super.onPause(); } }
注意事项
请调整Firebase安全规则,避免校验码节点被恶意篡改,参考规则如下:
{ "rules": { "valid_admin_qr_codes": { ".read": true, ".write": "auth != null" } } }
上述规则仅允许已登录的后台管理员修改校验码,所有人可读取校验,若你有更严格的安全要求可自行调整规则。
内容的提问来源于stack exchange,提问作者billy
相关产品推荐
相关产品推荐

