使用为每个用户生成的唯一密钥限制 Firebase 数据库规则。 (安卓工作室)

Posted

技术标签:

【中文标题】使用为每个用户生成的唯一密钥限制 Firebase 数据库规则。 (安卓工作室)【英文标题】:Restrict Firebase Database rules using unique key generated to every user. (Android studio) 【发布时间】:2017-08-04 21:37:37 【问题描述】:

嘿,我正在开发一个应用程序,让学生学生保存他们的日程安排并在需要时访问它。 我将他们的时间表保存在 Firebase 数据库中,并为每个用户附加唯一 ID,并将他们的课程名称和作为孩子的各自上课时间保存到唯一 ID。

问题是,我如何设置 firebase 规则来限制每个用户只能修改存储在其唯一键下的数据。

看起来像这样

规则目前是公开的以供测试。

【问题讨论】:

【参考方案1】:

-K... 值似乎是一个推送 ID,它不是有效的 Firebase 身份验证 UID。因此,我觉得您的用户没有登录。虽然您绝对可以提出一个推送 ID 识别用户的系统,但这些 ID 不会延续到 Firebase 身份验证或 Firebase 数据库安全规则。老实说:如果他们会继续下去,那将是非常不安全的。

如果您想在不要求他们使用电子邮件+密码或社交服务提供商登录的情况下安全地识别您的用户,请使用Firebase's anonymous authentication。对于用户来说,它的工作原理是一样的:他们不必登录。但对于 Firebase,这意味着他们是具有真实 UID 的经过适当身份验证的用户。代码很简单:

FirebaseAuth.getInstance().signInAnonymously()
    .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) 
            Log.d(TAG, "signInAnonymously:onComplete:" + task.isSuccessful());

            // If sign in fails, display a message to the user. If sign in succeeds
            // the auth state listener will be notified and logic to handle the
            // signed in user can be handled in the listener.
            if (!task.isSuccessful()) 
                Log.w(TAG, "signInAnonymously", task.getException());
                Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                        Toast.LENGTH_SHORT).show();
            

            // ...
        
    );

并检测已登录的用户(当他们重新启动应用程序时也会再次选择他们):

FirebaseAuth.getInstance().addAuthStateListener(new FirebaseAuth.AuthStateListener() 
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) 
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null) 
            // User is signed in
            Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
         else 
            // User is signed out
            Log.d(TAG, "onAuthStateChanged:signed_out");
        
        // ...
    
;

【讨论】:

谢谢,我把这个放在哪里?我想在哪里登录? 第一个 sn-p 是您实际登录的位置。第二个 sn-p 应输入 onCreateonStart。请查看我链接的文档以获得进一步解释,因为其中包含我在上面复制的工作代码。

以上是关于使用为每个用户生成的唯一密钥限制 Firebase 数据库规则。 (安卓工作室)的主要内容,如果未能解决你的问题,请参考以下文章

使用生成的密钥插入 Firebase

如果firebase没有身份验证,如何限制API密钥?

如何在firebase自动生成的密钥下编辑子值

用于 Firebase 实时数据库/Firebase 身份验证的 Android 唯一密钥

为每个产品密钥生成序列号并验证它们[关闭]

为节点 js 应用程序中的用户生成唯一的 api 密钥以访问您的 api