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

如何在Firebase中仅允许指定Google用户访问仪表盘?

Firebase 特定Google用户白名单访问设置方案

要实现仅允许3个特定Google用户登录后访问仪表盘,需要结合前端登录校验、路由防护,同时如果涉及数据库操作,必须配置数据库规则——前端校验是第一道关卡,数据库规则是服务器端的安全防线(防止前端校验被绕过)。

步骤1:收集允许访问的用户UID

Google用户的displayName可能重复,而Firebase的用户UID是唯一且不可篡改的,所以白名单必须用UID。你可以先让这3个用户登录一次,从控制台或登录成功的result.user.uid里获取他们的UID,整理成白名单数组:

const allowedUids = ["用户1的UID", "用户2的UID", "用户3的UID"];

步骤2:修改登录代码,加入白名单校验

在登录成功后立即校验用户UID是否在白名单内,不在则直接登出并拒绝访问:

const signInWithGoogle = async () => {
  try {
    const result = await signInWithPopup(auth, provider);
    const userId = result.user.uid;
    const allowedUids = ["用户1的UID", "用户2的UID", "用户3的UID"];
    
    if (allowedUids.includes(userId)) {
      const username = result.user.displayName;
      addUser(username, userId);
      navigate('/todos');
    } else {
      await signOut(auth);
      alert("你没有访问权限");
      navigate('/login');
    }
  } catch (err) {
    console.log(err);
  }
}

步骤3:路由/页面级别的权限防护

就算用户通过手动输入URL跳转到仪表盘,也要在页面组件里校验当前用户权限。以React为例,在/todos组件中添加监听:

import { useEffect } from 'react';
import { onAuthStateChanged, signOut } from 'firebase/auth';
import { auth } from './firebase-config';
import { useNavigate } from 'react-router-dom';

function Todos() {
  const navigate = useNavigate();
  
  useEffect(() => {
    const unsubscribe = onAuthStateChanged(auth, (user) => {
      const allowedUids = ["用户1的UID", "用户2的UID", "用户3的UID"];
      if (!user || !allowedUids.includes(user.uid)) {
        signOut(auth);
        navigate('/login');
      }
    });
    // 组件卸载时取消监听
    return unsubscribe;
  }, [auth, navigate]);
  
  // 组件其余逻辑...
}

步骤4:配置数据库规则(关键!)

如果仪表盘需要读取/写入Firebase数据库(Firestore或实时数据库),必须配置服务器端规则,限制只有白名单内的UID才能操作数据。以Firestore为例,规则如下:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // 限制所有文档仅允许白名单用户读写
    match /{document=**} {
      allow read, write: if request.auth != null && request.auth.uid in ["用户1的UID", "用户2的UID", "用户3的UID"];
    }
  }
}

实时数据库的规则类似:

{
  "rules": {
    ".read": "auth != null && auth.uid in ['用户1的UID', '用户2的UID', '用户3的UID']",
    ".write": "auth != null && auth.uid in ['用户1的UID', '用户2的UID', '用户3的UID']"
  }
}

总结

  • 前端校验和路由防护是为了给用户友好的访问拦截体验;
  • 数据库规则是必须的,因为前端代码可以被篡改绕过,服务器端规则是数据安全的最后保障。

内容的提问来源于stack exchange,提问作者Luka Miljković

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:15:39