From 9eeba6c48348d55111deb3bd18f94f9dc4b86118 Mon Sep 17 00:00:00 2001 From: Edric Date: Sat, 9 May 2020 18:46:26 +0800 Subject: [PATCH 1/2] feat(auth-guard): add support for specifying a `string` to redirect to Closes #2287, #2144 --- docs/auth/router-guards.md | 4 ++-- src/auth-guard/auth-guard.ts | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/auth/router-guards.md b/docs/auth/router-guards.md index 841eb306b..5aa901ca6 100644 --- a/docs/auth/router-guards.md +++ b/docs/auth/router-guards.md @@ -80,7 +80,7 @@ import { customClaims } from '@angular/fire/auth-guard'; // This pipe will only allow users with the editor role to access the route // { path: 'articles/:id/edit', component: ArticleEditComponent, ...canActivate(editorOnly) } -const editorOnly = () => pipe(customClaims, map(claims => claims.role === "editor")); +const editorOnly = () => pipe(customClaims, map(claims => claims.role === 'editor')); ``` ### Using router state @@ -98,5 +98,5 @@ const onlyAllowSelf = (next) => map(user => !!user && next.params.userId === use // Only allow navigation to the route if the user has a custom claim matching :accountId // { path: 'accounts/:accountId/billing', component: BillingDetailsComponent, ...canActivate(accountAdmin) } -const accountAdmin = (next) => pipe(customClaims, map(claims => claims[`account-${next.params.accountId}-role`] === "admin")); +const accountAdmin = (next) => pipe(customClaims, map(claims => claims[`account-${next.params.accountId}-role`] === 'admin')); ``` diff --git a/src/auth-guard/auth-guard.ts b/src/auth-guard/auth-guard.ts index 1887dd157..7a9375cf5 100644 --- a/src/auth-guard/auth-guard.ts +++ b/src/auth-guard/auth-guard.ts @@ -13,7 +13,7 @@ import { } from '@angular/fire'; export type AuthPipeGenerator = (next: ActivatedRouteSnapshot, state: RouterStateSnapshot) => AuthPipe; -export type AuthPipe = UnaryFunction, Observable>; +export type AuthPipe = UnaryFunction, Observable>; export const loggedIn: AuthPipe = map(user => !!user); @@ -49,14 +49,16 @@ export class AngularFireAuthGuard implements CanActivate { return this.authState.pipe( take(1), authPipeFactory(next, state), - map(can => typeof can === 'boolean' ? can : this.router.createUrlTree(can as any[])) + map(can => typeof can === 'boolean' ? can : + Array.isArray(can) ? this.router.createUrlTree(can) : this.router.parseUrl(can) + ) ); } } export const canActivate = (pipe: AuthPipeGenerator) => ({ - canActivate: [ AngularFireAuthGuard ], data: { authGuardPipe: pipe } + canActivate: [ AngularFireAuthGuard ], data: { authGuardPipe: pipe } }); @@ -65,5 +67,5 @@ export const idTokenResult = switchMap((user: User|null) => user ? user.getIdTok export const emailVerified: AuthPipe = map(user => !!user && user.emailVerified); export const customClaims = pipe(idTokenResult, map(idTokenResult => idTokenResult ? idTokenResult.claims : [])); export const hasCustomClaim = (claim: string) => pipe(customClaims, map(claims => claims.hasOwnProperty(claim))); -export const redirectUnauthorizedTo = (redirect: any[]) => pipe(loggedIn, map(loggedIn => loggedIn || redirect)); -export const redirectLoggedInTo = (redirect: any[]) => pipe(loggedIn, map(loggedIn => loggedIn && redirect || true)); +export const redirectUnauthorizedTo = (redirect: string|any[]) => pipe(loggedIn, map(loggedIn => loggedIn || redirect)); +export const redirectLoggedInTo = (redirect: string|any[]) => pipe(loggedIn, map(loggedIn => loggedIn && redirect || true)); From f7d12857a69ecef2e5ef65e32ded6b97161ca5f1 Mon Sep 17 00:00:00 2001 From: Edric Date: Tue, 16 Jun 2020 00:03:05 +0800 Subject: [PATCH 2/2] refactor(auth-guard): make ternary easier to read --- src/auth-guard/auth-guard.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/auth-guard/auth-guard.ts b/src/auth-guard/auth-guard.ts index 7a9375cf5..5c8968fa8 100644 --- a/src/auth-guard/auth-guard.ts +++ b/src/auth-guard/auth-guard.ts @@ -49,9 +49,16 @@ export class AngularFireAuthGuard implements CanActivate { return this.authState.pipe( take(1), authPipeFactory(next, state), - map(can => typeof can === 'boolean' ? can : - Array.isArray(can) ? this.router.createUrlTree(can) : this.router.parseUrl(can) - ) + map(can => { + if (typeof can === 'boolean') { + return can; + } else if (Array.isArray(can)) { + return this.router.createUrlTree(can); + } else { + // TODO(EdricChan03): Add tests + return this.router.parseUrl(can); + } + }) ); }