проверка карты электронной почты в пожарном магазине - PullRequest
1 голос
/ 03 августа 2020

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

email{
    work: ""
    personal: ""
}

Проблема заключается в том, что я не могу гарантировать, что заданное значение c будет соответствовать регулярному выражению. Пользователи должны иметь возможность иметь только личный адрес электронной почты, только рабочий адрес электронной почты или и личный, и рабочий адрес электронной почты. Все ситуации должны приводить к подтвержденным адресам электронной почты в firestore.

В настоящее время у меня есть следующий код, но я не могу понять, как работать с такими картами:

match /organisations/{orgID}/people/{userID} {
    allow create: if(request.resource.data.email.matches(^[A-Za-z0-9]{3,}[@]{1}[A-Za-z0-9]{3,}[.]{1}[A-Za-z0-9]{3,}$) == true);
}

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

Сейчас у меня есть что-то вроде этого, но я получаю сообщение об ошибке, потому что firebase, похоже, не распознает | (ИЛИ) оператор. Есть ли альтернатива этому? Я пытаюсь проверить, является ли электронное письмо действительным или пустым.

match /organisations/{orgID}/people/{userID}{
    allow create: if(
        request.resource.data.email.work.matches(^[A-Za-z0-9.]{3,}[@]{1}[A-Za-z0-9.]{3,}[.]{1}[A-Za-z0-9.]{3,}$|"") 
    );
}

Заранее благодарим за помощь!

1 Ответ

2 голосов
/ 03 августа 2020

У вас здесь две разные проблемы. Они не имеют прямого отношения друг к другу. Я постараюсь рассмотреть их отдельно.

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

Если вы хотите используйте значение вложенного поля в поле карты, вы можете просто использовать точечную нотацию, чтобы добраться до него:

request.resource.data.email.work
request.resource.data.email.personal

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

Вам нужно будет написать logi c, чтобы проверить каждое поле карты отдельно. Вы не можете проверить все поля карты одновременно.

...