programing

사용자에게 이 개체에 액세스할 수 있는 권한이 없습니다.Firebase 스토리지 안드로이드

newstyles 2023. 7. 3. 22:36

사용자에게 이 개체에 액세스할 수 있는 권한이 없습니다.Firebase 스토리지 안드로이드

저는 소방서 창고가 처음입니다.단지 그것을 배울 수 있도록, 나는 버튼과 하나가 있는 간단한 앱을 만들었습니다.ImageView버튼을 클릭하면 이미지가(from drawable)이미지 보기에 표시됩니다.파이어베이스에 이미지를 업로드하기 위한 코드도 작성했지만 예외 메시지는onAddFailureListener사용자에게 이 개체에 액세스할있는 권한이 없습니다라는 메시지를 표시합니다.어떻게 해야 하나?

package com.example.asad.save_photo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.net.Uri;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageMetadata;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import java.io.ByteArrayOutputStream;
import java.io.File;

public class MainActivity extends AppCompatActivity {

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

        StorageReference storageRef = storage.getReferenceFromUrl("gs://savephoto-a1cc3.appspot.com");

        final StorageReference mountainsRef = storageRef.child("asad");

        Button butt = (Button) findViewById(R.id.button);


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

                ImageView imageView = (ImageView) findViewById(R.id.image);
                imageView.setImageResource(R.drawable.back2);
                //imageView.setImageResource(R.drawable.back2);

                imageView.setDrawingCacheEnabled(true);
                imageView.buildDrawingCache();
                Bitmap bitmap = imageView.getDrawingCache();


                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                final byte[] data = baos.toByteArray();

                UploadTask uploadTask = mountainsRef.putBytes(data);
                uploadTask.addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        // Handle unsuccessful uploads
                        showToast(exception.getMessage());
                    }
                });
                        uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
                        //Uri downloadUrl = taskSnapshot.getDownloadUrl();
                        showToast("success !!!!!");
                    }
                });


            }
        });

    }

    public void showToast(String s) {
        Toast.makeText(this,s,Toast.LENGTH_LONG).show();
    }
}

여기 내 소방 기지 저장 규칙이 있습니다.

service firebase.storage {
  match /b/savephoto-a1cc3.appspot.com/o {
    allow read,write;
  }
}

보안 규칙 업데이트match /{allPaths=**}모든 경로에서 공용 읽기 및 쓰기 액세스가 허용됨을 나타냅니다.

service firebase.storage {
  match /b/savephoto-a1cc3.appspot.com/o {
    match /{allPaths=**} {
      // Allow access by all users
      allow read, write;
    }
  }
}

다양한 기본 규칙이 설명서의 예제 규칙 섹션 탭에 제공됩니다.

Firebase 콘솔에서 스토리지 규칙 변경

enter image description here

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

다음 단계를 수행합니다.

  1. "스토리지"로 이동

  2. 규칙 탭을 선택하고 아래와 같이 규칙을 편집합니다.

응용 프로그램에 인증 기능이 있는 경우 다음을 사용합니다.

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

응용 프로그램에 로그인 기능이 없는 경우(사용자가 스토리지에 액세스할 수 있는 경우) 다음을 사용합니다.

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

저장소로 이동 -> 규칙 탭

이것을 추가합니다.

// Anyone can read or write to the bucket, even non-users of your app.
// Because it is shared with Google App Engine, this will also make
// files uploaded via GAE public.
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

enter image description here

[스토리지] - [규칙]으로 이동합니다.규칙을 다음과 같이 입력하고 버킷 이름을 사용자 고유의 버킷 이름으로 바꿉니다.[저장] - [파일]로 이동하여 버킷 이름을 찾을 수 있습니다.

다음과 같이 보여야 합니다. myapplication-xxxx.appspot.com

그게 당신이 필요한 전부입니다.테스트 목적으로만 인증을 수행하는 경우 인증을 사용 가능으로 설정할 필요가 없습니다.인증이 필요한 경우 나중에 추가할 수 있습니다.

enter image description here

파이어베이스에 있는 저장/보관 폴더로 이동하여 다음 코드를 붙여넣으십시오.

 rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

이 문제는 방화벽 스토리지 규칙에 있습니다.로 변경

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

다음을 확인합니다.if request.auth != null

인증된 사용자만 쓰기를 허용하지만 모두가 읽습니다.

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

이 해결책들은 정말로 제 문제를 해결하지 못했습니다.

내 문제를 해결한 것은 다음과 같은 대사들입니다.

앱 모듈에서

implementation 'com.google.firebase:firebase-database:15.0.0'
implementation 'com.google.firebase:firebase-storage:15.0.0'
implementation 'com.google.firebase:firebase-auth:15.0.0'

그리고 이 코드는 업로드하고 다운로드 링크를 얻기 위한 것입니다.

private void uploadImageToFirebase(Bitmap bmp) {

    try {
        String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() +
                "/news";
        File dir = new File(file_path);
        if (!dir.exists())
            dir.mkdirs();
        File file = new File(dir, "sketchpad" + "_" + ".png");
        FileOutputStream fOut = new FileOutputStream(file);
        bmp.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        Log.i("SECONDACTIVITY", "ADDED SUCCESSFULLY");

        Uri file2 = Uri.fromFile(file);


        //Now Upload
        final StorageReference storageRef = FirebaseStorage.getInstance().getReference();
        StorageReference riversRef = storageRef.child(file.getName());
        UploadTask uploadTask;
        uploadTask = riversRef.putFile(file2);
        progressDialog.show();
        progressDialog.setCancelable(false);


        uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                progressDialog.incrementProgressBy((int) progress);
            }
        });
        uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                progressDialog.dismiss();
                Uri DownloadLink = taskSnapshot.getDownloadUrl();
                String imgUrl = DownloadLink.toString();
                FirebaseDatabase.getInstance().getReference().child("image_link").setValue(imgUrl);
            }
        });
        uploadTask.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                progressDialog.dismiss();
            }
        });


    } catch (IOException e) {
        e.printStackTrace();
    }


}
service firebase.storage {
  match /b/fir-upload-a2fa6.appspot.com/o {
    match /{allPaths=**} {
      // Allow access by all users
      allow read, write;
    }
  }
}

Firebase 스토리지 오류(해결됨) 1.2에서 작업 중인 프로젝트의 파이어베이스 콘솔로 이동합니다.Firebase 콘솔의 스토리지 아래와 규칙 아래에서 service firebase.storage를 편집합니다.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

파이어베이스에 있는 누군가에게 도움이 되기를 바라며 이 답변을 추가합니다.

  1. "스토리지"로 이동

  2. 규칙 탭을 선택하고 아래와 같이 규칙을 편집합니다.

    service firebase.storage {
       match /b/{bucket}/o {
         match /{allPaths=**} {
           // Allow access by all users
           allow read, write: if request.auth != null;
         }
       }
     }
    

참고: 프로젝트 이름에 대해 {bucket}을(를) 바꾸지 말고 위와 같이 정확히 준비해야 합니다.

Firebase 스토리지 오류(해결됨) 1.2에서 작업 중인 프로젝트의 파이어베이스 콘솔로 이동합니다.Firebase 콘솔의 스토리지 아래와 규칙 아래에서 service firebase.storage를 편집합니다.

service firebase.storage {
 match /b/{bucket}/o {
  match /{allPaths=**} {
  allow read, write;
  }
 }
}

참고: 이 문제를 해결하지 못한 경우에는 화력 기지 계획이 만료되었는지 확인하십시오.

timestamp.date(2023, 3, 27) 이전처럼 날짜를 timestamp.date(2023, 6, 27)로 변경했습니다.

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if
          request.time < timestamp.date(2023, 6, 27);
    }
  }
}

언급URL : https://stackoverflow.com/questions/38671444/user-does-not-have-permission-to-access-this-object-firebase-storage-android