AngularFireAuthGuard с несколькими условиями - PullRequest
1 голос
/ 20 ноября 2019

Я работаю над проектом Ionic, который использует AngularFire. Приложение имеет две основные функции.

  • Функция 1. Требуется, чтобы пользователи создали учетную запись и логин.
  • Функция 2. Не требует учетной записи или входа в систему.

IЯ использую AngularFireAuthGuard с каналом "redirectUnauthorizedToLogin" для управления маршрутизацией.

const redirectUnauthorizedToLogin = () => redirectUnauthorizedTo(['login']);

{ path: '...', loadChildren: '...', canActivate: [AngularFireAuthGuard], data: { authGuardPipe: redirectUnauthorizedToLogin } }, 

Обе функции взаимодействуют с FireStore. Из соображений безопасности я хочу внедрить анонимный вход в Firebase. Итак, для функции 2 я могу контролировать, кто может писать в БД, не давая разрешения всем. Между тем функция 1 по-прежнему требует учетной записи.

Здесь возникает проблема, потому что я не смог найти способ добавить два условия к функции 1 охранять что-то вроде

if (is anonymous || not logged in) redirectToLogin

Насколько я вижу, redirectUnauthorizedToLogin считает анонимный вход авторизованным.

Я проверил официальные документы и вижу, что есть встроенный канал IsNotAnonymous, но он упоминается только один раз, и я не смог найти другое его использование.

Iнадеюсь, кто-нибудь может помочь мне в этом.

Заранее спасибо,

Ionic:

   Ionic CLI                     : 5.2.1
   Ionic Framework               : @ionic/angular 4.6.0
   @angular-devkit/build-angular : 0.13.9
   @angular-devkit/schematics    : 7.2.4
   @angular/cli                  : 7.3.9
   @ionic/angular-toolkit        : 1.4.0

   "@angular/fire": "^5.2.1",
   "firebase": "^5.11.1",

Cordova:

   Cordova CLI       : 8.1.2 (cordova-lib@8.1.1)
   Cordova Platforms : android 7.1.4

Utility:

   cordova-res : 0.6.0
   native-run  : 0.2.7

System:

   Android SDK Tools : 26.1.1 (D:\Sdk)
   NodeJS            : v11.4.0 (D:\nodejs\node.exe)
   npm               : 6.4.1
   OS                : Windows 10

1 Ответ

0 голосов
/ 01 декабря 2019

Если вы извлекаете исходный код, вы можете увидеть, как они реализовали isNotAnonymous здесь: https://github.com/angular/angularfire/blob/5.2.3/src/auth-guard/auth-guard.ts#L32, но проблема в том, что isNotAnonymous отклоняет, но не перенаправляет. Я думаю, что вы можете в основном эмулировать эту строку: https://github.com/angular/angularfire/blob/5.2.3/src/auth-guard/auth-guard.ts#L37, чтобы добавить перенаправление.

Они способны работать с конвейерами, поэтому вам следует использовать:


import { AngularFireAuthGuard, isNotAnonymous } from '@angular/fire/auth-guard';

export const redirectAnonymousTo = (redirect: any[]) => 
  pipe(isNotAnonymous, map(loggedIn => loggedIn || redirect)
);

const redirectUnauthorizedToLogin = () => redirectAnonymousTo(['login']);

export const routes: Routes = [
  { path: '', component: AppComponent },
  { 
    path: 'items',
    component: ItemListComponent,
    canActivate: [AngularFireAuthGuard],
    data: { authGuardPipe: redirectUnauthorizedToLogin }
  }
];

Если он не прошел проверку подлинности или анонимный, он вернет false, поэтому произойдет перенаправление, в противном случае он переходит в true.

Я не пытался выполнить этот код, но, надеюсь, это будет хорошее начало.

...