2016-12-27 7 views
1

Я хочу, чтобы пользователи находили запись по значению, но я не хочу, чтобы они могли перечислять все записи.База данных Firebase: найти по значению без доступа к индексу

Например, я хочу создать вики, и я хочу, чтобы некоторые страницы были доступны только по прямым URL-адресам.

Я знаю, что могу предоставить доступ на чтение на уровне записи, и пользователь не сможет прочитать все ключи, но тогда я ограничу только символы, разрешенные для ключа, в то время как я могу использовать / и других персонажей.

Так что я бы сохранил путь вещи в его собственности path, а затем ищите вещь path;

// database structure 
things 
    -KNi4OQXGXsHKYHVuTln 
     path: "should/not/be/listed/anywhere" 

Я хочу, чтобы пользователь мог найти вещь, только если они знают путь.

Проблема в том, что я могу только найти вещь, с помощью функции поиска /things с orderByChild и equalTo:

// request with javascript 
firebase.database() 
    .ref('/things').orderByChild('path') 
    .equalTo("should/not/be/listed/anywhere") 
    .once('value', s=>{ }); 

Что означает, что я должен был бы дать доступ на чтение /things:

// database security rules 
{ 
    "rules": { 
     "things": { 
      ".read": true, 
      ".indexOn": ["path"], 
      "$thingId": { 
       ".validate": "newData.hasChildren(['path']) && newData.child('path').isString()" 
      } 
     } 
    } 
} 

и эффективно позволяет любому видеть все, что у меня есть. Есть ли способ избежать этого?

А если нет, значит ли это, что Firebase заставляет меня делать все мои вещи публичными, как только я хочу найти по стоимости имущества?

ответ

2

Чтобы иметь возможность найти что-то в базе данных Firebase, вы должны иметь доступ к нему. Нельзя этого избежать.

Мы обычно называем это «правилами не являются фильтрами», и вы можете найти больше об этом в documentation, в this answer и по searching for "rules are not filters" on Stack Overflow.

Если вы хотите предложить поиск без доступа, вам нужно будет настроить свою собственную службу поиска, которая запускает доверенный код, а затем предоставляет пути соответствующих элементов обратно клиенту.

Общие способы настройки такой службы поиска перед Firebase с помощью Firebase Flashlight library for ElasticSearch или с облачным сервисом поиска, например Algolia.

+0

Спасибо, Фрэнк. Я надеялся избежать создания и поддержки сервера для более простого проекта. – Yura

1

Я знал, что должен быть в состоянии избежать поддержки сервера для такой простой вещи, поэтому я отвечаю на свой вопрос.

Моя фактическая проблема заключалась в том, что я хотел дать пользователям доступ к вещам, когда они знают ключ, но не хотят, чтобы они видели все. Я мог бы сделать это, предоставив доступ на уровне предмета и используя путь в качестве ключа, но тогда ключи не позволили бы мне использовать /, и, конечно, я также хотел, чтобы структура моих вещей была плоской.

Осмотрев, что в очередной раз я нашел limitations on keys in firebase, которые являются

  • Max 768 символов
  • Запрещенные символы: . $ # [ ] /
  • Некоторые разрешенные символы: \ ! @ % & ? : ; , * = + < > () | " '^~ - _

Так что я могу просто создайте простую карту для перевода запрещенных символов на допустимые символы и используйте путь как ключ, который решает мою проблему lem: пользователи смогут получать доступ к вещам только тогда, когда они знают путь, в то время как путь может выглядеть как URL-адрес.

Смежные вопросы