【问题标题】:Firebase storage: Allow authenticated users to download filesFirebase 存储:允许经过身份验证的用户下载文件
【发布时间】:2019-11-18 18:22:35
【问题描述】:

我限制了 Firebase 的存储,只允许经过身份验证的用户从 Firebase 控制台读取和写入。除了 PDF 文件的下载页面外,我所有的项目请求都在工作。我怀疑我没有以正确的方式添加身份验证侦听器。

这是我的适配器和活动代码:

下载活动:

public class pdfDownloader extends AppCompatActivity {
    FirebaseFirestore db;
    FirebaseAuth mAuth;
    FirebaseAuth.AuthStateListener mAuthListner;
    FirebaseUser mUser;
    RecyclerView mRecyclerView;
    ArrayList<DownModel> downModelArrayList = new ArrayList<>();
    MyPdfAdapter myAdapter;
    public static final String TAG="LOGIN";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pdf_downloader);
        mAuth = FirebaseAuth.getInstance();
        mUser = FirebaseAuth.getInstance().getCurrentUser();
        mAuthListner = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                if(mUser != null) {
                    dataFromFirebase();
                } else {
                    Log.d(TAG,"AuthStateChanged:Logout");
                }
            }
        };
        setUpRV();
        setUpFB();
        dataFromFirebase();
    }

    protected void onStart() { // allowing users to see the links
        super.onStart();
        if(mUser == null) {
            dataFromFirebase();
        } else {
            Log.d(TAG,"AuthStateChanged:Logout");
        }
    }

    private void dataFromFirebase() {
        if(downModelArrayList.size() > 0)
            downModelArrayList.clear();
        db.collection("files")
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        for(DocumentSnapshot documentSnapshot: Objects.requireNonNull(task.getResult())) {
                            DownModel downModel= new DownModel(documentSnapshot.getString("name"),
                                    documentSnapshot.getString("link"));
                            downModelArrayList.add(downModel);

                        }
                        myAdapter= new MyPdfAdapter(pdfDownloader.this,downModelArrayList);
                        mRecyclerView.setAdapter(myAdapter);
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(pdfDownloader.this, "Error ;-.-;", Toast.LENGTH_SHORT).show();
                    }
                });
    }

    private void setUpFB(){
        db = FirebaseFirestore.getInstance();
    }

    private void setUpRV(){
        mRecyclerView= findViewById(R.id.recycle);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    }
}

下载适配器:

public class MyPdfAdapter extends RecyclerView.Adapter<MyViewHolder> {
    pdfDownloader pdfDownloader;
    ArrayList<DownModel> downModels;
    FirebaseFirestore db;

    public MyPdfAdapter(pdfDownloader pdfDownloader, ArrayList<DownModel> downModels) {
        this.pdfDownloader = pdfDownloader;
        this.downModels = downModels;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        LayoutInflater layoutInflater = LayoutInflater.from(pdfDownloader.getBaseContext());
        View view = layoutInflater.inflate(R.layout.elements, null, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, final int i) {
        myViewHolder.mName.setText(downModels.get(i).getName());
        myViewHolder.mLink.setText(downModels.get(i).getLink());
        myViewHolder.deletePdfBtn.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                deletepdf();
            }
        });

        myViewHolder.mDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                downloadFile(myViewHolder.mName.getContext(),downModels.get(i).getName(), ".pdf", DIRECTORY_DOWNLOADS,downModels.get(i).getLink());
            }
        });
    }

    private void deletepdf() {

        db.collection( "files" ).document()
                .delete()
                .addOnSuccessListener( new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {

                    }
                } );
    }

    public void downloadFile(Context context, String fileName, String fileExtension, String destinationDirectory, String url) {
        DownloadManager downloadmanager = (DownloadManager) context.
                getSystemService(Context.DOWNLOAD_SERVICE);
        Uri uri = Uri.parse(url);
        DownloadManager.Request request = new DownloadManager.Request(uri);
       request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setDestinationInExternalFilesDir(context, destinationDirectory, fileName + fileExtension);
        downloadmanager.enqueue(request);
    }


    @Override
    public int getItemCount() {
        return downModels.size();
    }
}

【问题讨论】:

    标签: java android firebase firebase-storage


    【解决方案1】:

    这解决了我的问题:

    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read, write: if request.auth != null;
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 2018-10-25
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多