5

Tôi đã tải xuống tệp json ủy nhiệm tài khoản dịch vụ của mình từ bảng điều khiển Firebase được đặt trước đó trong thư mục chính của dự án điểm cuối GAE khi tôi chạy bản sao cục bộ của mình.Thông tin đăng nhập tài khoản dịch vụ Firebase Json Đọc quyền từ chối

java.security.AccessControlException: access denied ("java.io.FilePermission" "\src\main\secret.json" "read") 

tôi đã cố gắng đặt các tập tin .json dưới src thư mục cũng nhưng không có sự giúp đỡ.

+0

Tôi đang gặp sự cố tương tự chính xác ngay bây giờ. Tôi đã thử đặt nó vào ổ đĩa của mình và truy cập như thế này: '.setServiceAccount (URL mới (" https: //drive.google.com/file/... ") .openStream())' nhưng tôi bị truy cập bị từ chối mặc dù không có quyền ngăn chặn nó. Tôi rất vui khi thấy những gì mọi người đến với – booky99

+0

Tôi sẽ đăng giải pháp tôi tìm thấy tối nay. Tôi có một cặp vợ chồng làm việc xung quanh cho bạn. Hãy cho tôi khoảng 2 giờ. – booky99

Trả lời

0

Cuối cùng, tôi tìm thấy giải pháp, nó được viết dưới các API và tài liệu tham khảo phần của Google App Engine trong link này, rằng chúng ta cần thêm các tệp như vậy vào tệp appengine-web.xml dưới thẻ <resource-files>, sử dụng thuộc tính <include path=""/>. Sau khi làm như vậy công trình của nó cho tôi. Tôi đã đặt tệp .json chứa thông tin đăng nhập dự án vào thư mục WEB-INF và sau đó nhập đường dẫn tương đối của nó vào thẻ <resource-files>.

+0

Đường dẫn tương đối của bạn trông như thế nào? Tôi vẫn nhận được lỗi này sau khi thêm nó vào thẻ tài nguyên-tệp. Có lẽ nó đã làm với con đường? Ngoài ra, có điều gì khác biệt trong cách bạn khởi chạy Firebase không? Giống như những gì con đường trông giống như để tham khảo các tập tin đó là tốt? Cảm ơn –

0

Bạn nên đặt các tệp json theo src/main/resources

0

Tôi tìm thấy một vài cách tiếp cận này. Đầu tiên là bằng cách lấy nó từ một tập tin qua một luồng internet. Cái kia là cục bộ.

INTERNET CÁCH

phương pháp đầu tiên của tôi liên quan đến lưu trữ các tập tin vào thư mục dropbox công cộng của tôi. Tôi có liên kết có thể chia sẻ (chắc chắn rằng nó kết thúc bằng .json) và dán nó trong ví dụ chuỗi "https://dl.dropboxusercontent.com/..EXAMPLE-CREDENTIALS"

/** A simple endpoint method that takes a name and says Hi back */ 
    @ApiMethod(name = "sayHi") 
    public MyBean sayHi(@Named("name") String name) { 

     MyBean mModelClassObject = null; 

     String text = ""; 

     try { 
      String line = ""; 
      StringBuilder builder = new StringBuilder(); 
      URL url = new URL("https://dl.dropboxusercontent.com/..EXAMPLE-CREDENTIALS"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); 


      while ((line = reader.readLine()) != null) { 
       // ... 
       builder.append(line); 
      } 
      reader.close(); 

      text = builder.toString(); 
     } catch (MalformedURLException e) { 
      // ... 
     } catch (IOException e) { 
      // ... 
     } 

     InputStream stream = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)); 

     FirebaseOptions options = null; 
     options = new FirebaseOptions.Builder() 
       .setServiceAccount(stream) 
       .setDatabaseUrl("https://[PROJECT-ID].firebaseio.com/") 
       .build(); 
     FirebaseApp.initializeApp(options); 

     DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 
     final TaskCompletionSource<MyBean> tcs = new TaskCompletionSource<>(); 


     Task<MyBean> tcsTask = tcs.getTask(); 

     ref.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       MyBean result = dataSnapshot.getValue(MyBean.class); 
       if(result != null){ 
        tcs.setResult(result); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError){ 
       //handle error 
      } 
     }); 

     try { 
      mModelClassObject = Tasks.await(tcsTask); 
     }catch(ExecutionException e){ 
      //handle exception 
     }catch (InterruptedException e){ 
      //handle exception 
     } 

     return mModelClassObject; 
    } 

ĐỊA PHƯƠNG CÁCH

Một cách khác là dùng phiên bản trên và bỏ qua một cái gì đó giống như dropbox

/** A simple endpoint method that takes a name and says Hi back */ 
     @ApiMethod(name = "sayHi") 
    public MyBean sayHi(@Named("name") String name) { 

     MyBean mModelClassObject = null; 

     String text = "JUST PASTE YOUR JSON CONTENTS HERE"; 

     InputStream stream = new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)); 

     FirebaseOptions options = null; 
     options = new FirebaseOptions.Builder() 
       .setServiceAccount(stream) 
       .setDatabaseUrl("https://[PROJECT-ID].firebaseio.com/") 
       .build(); 
     FirebaseApp.initializeApp(options); 

     DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 
     final TaskCompletionSource<MyBean> tcs = new TaskCompletionSource<>(); 


     Task<MyBean> tcsTask = tcs.getTask(); 

     ref.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       MyBean result = dataSnapshot.getValue(MyBean.class); 
       if(result != null){ 
        tcs.setResult(result); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError){ 
       //handle error 
      } 
     }); 

     try { 
      mModelClassObject = Tasks.await(tcsTask); 
     }catch(ExecutionException e){ 
      //handle exception 
     }catch (InterruptedException e){ 
      //handle exception 
     } 

     return mModelClassObject; 
    } 

Tôi không biết điều này có thực hiện tốt nhất hay không nhưng dự án của tôi hiện đang hoạt động. Tôi cũng bao gồm mã của firebase để nhận thông tin. hãy xem câu trả lời này cho một số question tôi đã hỏi gần đây về việc đọc và ghi vào cơ sở firebase.

EDIT

dọn dẹp phiên bản mà doesnt ném lỗi

public class MyEndpoint { 

    private FirebaseOptions options; 
    private DatabaseReference ref; 
    private String serviceAccountJSON = "i took mine out for security reasons"; 

    // create firebase instance if need be 
    private void connectToFirebase(){ 
     if (options == null) { 
      options = null; 
      options = new FirebaseOptions.Builder() 
        .setServiceAccount(new ByteArrayInputStream(serviceAccountJSON.getBytes(StandardCharsets.UTF_8))) 
        .setDatabaseUrl("https://[PROJECT-ID].firebaseio.com/") 
        .build(); 
      FirebaseApp.initializeApp(options); 
     } 
     if(ref == null) { 
      ref = FirebaseDatabase.getInstance().getReference(); 
     } 
    } 

    /** A simple endpoint method that takes a name and says Hi back */ 
    @ApiMethod(name = "sayHi") 
    public MyBean sayHi(@Named("name") String name) { 

     // always do this first 
     connectToFirebase(); 

     MyBean mModelClassObject = null; 

     final TaskCompletionSource<MyBean> tcs = new TaskCompletionSource<>(); 
     Task<MyBean> tcsTask = tcs.getTask(); 

     // get the info 
     ref.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       MyBean result = dataSnapshot.getValue(MyBean.class); 
       if(result != null){ 
        tcs.setResult(result); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError){ 
       //handle error 
      } 
     }); 

     // wait for it 
     try { 
      mModelClassObject = Tasks.await(tcsTask); 
     }catch(ExecutionException e){ 
      //handle exception 
     }catch (InterruptedException e){ 
      //handle exception 
     } 

     mModelClassObject.setData(mModelClassObject.getData() + name); 

     return mModelClassObject; 
    } 
} 
Các vấn đề liên quan