Я использую firebase с аутентификацией и firestore. Прошедшие аутентификацию пользователи сохраняются в базе данных при регистрации с полем дополнительных ролей, где у некоторых пользователей есть роль администратора. Я хочу защитить административный маршрут и использую canActivate route guard. В функции canActivate я использую 2 наблюдаемых. Первый 1 получает зарегистрированного пользователя и вложен в этот другой наблюдаемый объект, который получает сохраненных пользователей из firestore, использует информацию оттуда o cehck, если зарегистрированный пользователь является администратором или нет. Проблема в том, что routeguard работает нормально, когда браузер обновляется после типов маршрута в браузере, но когда маршрут вызывается со ссылкой на маршрутизатор на кнопке, ничего не происходит.
пытался использовать синхронные значения, но они работают только один раз и перестают работать после навигации.
Функция canActivate: https://i.imgur.com/Rf0BZ79.png
canActivate(router: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.afAuth.getStateOnly().pipe(switchMap(user => { return this.db.getRole(user.uid) }))
}
Используемые наблюдаемые: https://i.imgur.com/hRp8zyf.png https://i.imgur.com/oV56AGl.png
// пользовательский объект или null из firebase
getStateOnly() {
return this.afAuth.authState
}
// проверка роли и возврат true или false (userArr - это массив пользователей, наблюдаемых для хранения пользователей из firestore)
getRole(uid: string): Observable<boolean> {
return this.userArr.pipe(map(users => {
return users.filter(user => {
if (user.uid === uid) {
return user
}
})[0].roles.includes('admin')
}))
Таким образом, это работает только тогда, когда я ввожу путь в браузере, и браузер обновляется при загрузке маршрута. Он не работает, когда я нажимаю кнопку администратора, чтобы перейти на страницу администратора (не с routerLink или router.navigate (..))
first()
в конвейер Observable, чтобы убедиться, что Observable завершается. - person Will Alexander   schedule 11.09.2019