【问题标题】:java code if we want that only person which is authenticated in firebase can write while others can read which are not authenticatedjava代码,如果我们希望只有在firebase中经过身份验证的人可以写入,而其他人可以读取未经身份验证的人
【发布时间】:2020-06-20 12:47:04
【问题描述】:

我想制作一个应用程序,其中只有第一次通过应用程序输入电子邮件和密码在 firebase 中通过身份验证的人才能更改或添加 firebase 中的数据/视频,而其他未通过身份验证的用户并且正在使用该应用程序只能阅读/观看管理员添加的视频。

{
  "rules": {
    ".read": true,
    ".write": "auth.uid === 'userID'"
  }
}

以上是firebase代码。简而言之,我只想知道userId 将自动被实际的userId 替换,比如说'adjkekloudh' 或者我们需要用java 编写任何代码,如果是,那么请帮助

这是我在 firebase 中的规则公开时使用的 java 代码,适用于所有经过身份验证的人,但我希望只有管理员应该保持身份验证,并且没有身份验证/登录/注册的用户可以观看视频。

public class MainActivity extends AppCompatActivity {

    private FirebaseDatabase database;
    private DatabaseReference databaseReference;
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private static final String TAG = "MainActivity";

    private EditText email;
    private EditText password;
    private Button login;
    private Button signUp;
    private Button iamUser;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        email = (EditText) findViewById(R.id.ETemailaddressID);
        password = (EditText) findViewById(R.id.ETPasswordID);
        login =(Button) findViewById(R.id.loginBtnID);
        signUp =(Button) findViewById(R.id.signUpBtnID);
        iamUser = (Button) findViewById(R.id.iamUserID);


        mAuth = FirebaseAuth.getInstance();
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        //final DatabaseReference mref = database.getReference("message");

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

                FirebaseUser user = firebaseAuth.getCurrentUser();

                if(user != null){
                    // user is singned in
                    Toast.makeText(MainActivity.this,"Signed In",Toast.LENGTH_LONG).show();
                }
                else{
                    // user is not signed in
                    Toast.makeText(MainActivity.this,"No such user exists!",Toast.LENGTH_LONG).show();
                }
            }
        };

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String emailString = email.getText().toString();
                String pwd = password.getText().toString();

                if(!emailString.equals("") && !pwd.equals("")){
                    mAuth.signInWithEmailAndPassword(emailString,pwd)
                            .addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {

                            if(!task.isSuccessful()){

                                Toast.makeText(MainActivity.this,"Wrong email or password",Toast.LENGTH_LONG).show();
                            }else{

                                Toast.makeText(MainActivity.this,"Signed In",Toast.LENGTH_LONG).show();

                                // we can now write to database

                               // Customer customer = new Customer("Disha","sonalname@gmail.com","Namdev",19);
                               // mref.setValue(customer);
                                Intent intent = new Intent(MainActivity.this, UploadVideo.class);
                                startActivity(intent);
                                finish();
                            }

                        }
                    });
                }
            }
        });

        signUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                startActivity(new Intent(MainActivity.this, SignUpActivity.class));
            }
        });

        iamUser.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                startActivity(new Intent(MainActivity.this, ShowVideoActivity.class));
            }
        });


    }

    @Override
    protected void onStart() {
        super.onStart();

        mAuth.addAuthStateListener(mAuthListener);
    }

    @Override
    protected void onStop() {
        super.onStop();

        if(mAuthListener != null){
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }
}

注意:这里的注册按钮适用于管理员/老板,他们将第一次输入他的电子邮件和密码,登录按钮再次用于管理员在 firebase 中添加数据,i_am_user 按钮适用于用户,以便他们可以直接去到管理员添加的视频列表。

【问题讨论】:

    标签: java firebase firebase-realtime-database firebase-security


    【解决方案1】:

    如果您希望任何经过身份验证的用户能够写入文件,您可以使用

    ".write": "auth.uid != null"
    

    我建议在这种情况下使规则更严格以匹配您的应用程序逻辑,因为上述任何人都可以通过一次 API 调用登录并替换/删除您的整个数据库。 security rules 的文档中有一些很好的例子。


    如果您只希望特定用户写入文件,则需要知道他们的 UID 并手动将其添加到您的规则中。这不会(也不能)自动发生。

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 2015-10-12
      • 2014-12-05
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 2019-09-25
      • 2015-05-10
      相关资源
      最近更新 更多