我为我的网络应用程序创建了一个 Authguard,并分配了几个路由,如主页、登录、注册等。
预期行为:
- 主页 - 目的是在用户未登录时显示登录页面
- 登录,注册,忘记密码等 - 如果用户已经登录,则目的是将用户重定向到主页(如果用户在地址栏中键入 url,则避免将登录页面显示给已登录的用户)
实际行为:
如果没有登录的用户访问主页,他将被重定向到登录页面,但该页面不显示。
如果用户通过 URL 访问登录页面,则该页面不会再次显示。[无论用户是否登录]
如果我删除登录页面的 auth 保护,加载主页会将用户重定向到登录页面,并且页面会正确显示。
我的 AuthGuard 代码
@Injectable()
export class AuthGuard implements CanActivate {
constructor(
private afAuth: AngularFireAuth,
private router: Router,
private storageService: LocalStorageService
) {}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> | boolean {
return this.afAuth.authState.pipe(
take(1),
map(user => !!user),
tap(loggedIn => {
const url = route.url.toString();
if (url === ROUTE_SIGNIN || url === ROUTE_SIGNUP || url.includes(ROUTE_FORGOT_PASSWORD) ) {
if (loggedIn) {
this.router.navigate([ROUTE_HOME]);
return of(false);
}
} else if (url === ROUTE_HOME) {
const skipped = this.storageService.getValue(KEY_SIGNIN_SKIPPED);
if (!loggedIn && !skipped) {
this.router.navigate([ROUTE_SIGNIN]);
return of(false);
}
}
return of(true);
})
);
}
}
编辑:路线:
const routes: Routes = [
{
path: '',
redirectTo: ROUTE_HOME,
pathMatch: 'full'
},
{ path: ROUTE_HOME, loadChildren: './pages/home/home.module#HomePageModule', canActivate: [AuthGuard] },
{ path: ROUTE_NAV_LIST, loadChildren: './pages/list/list.module#ListPageModule', canActivate: [AuthGuard] },
{ path: ROUTE_SIGNIN, loadChildren: './pages/signin/signin.module#SigninPageModule', canActivate: [AuthGuard] },
{ path: ROUTE_SIGNUP, loadChildren: './pages/signup/signup.module#SignupPageModule', canActivate: [AuthGuard] },
{ path: ROUTE_FORGOT_PASSWORD, loadChildren: './pages/forgot-password/forgot-password.module#ForgotPasswordPageModule'
, canActivate: [AuthGuard] },
{ path: ROUTE_PHONE_VERIFICATION, loadChildren: './pages/phone-verification/phone-verification.module#PhoneVerificationPageModule'
, canActivate: [AuthGuard] },
];
我可以理解这里的问题是将 Authguard 分配给登录页面。但我无法确定导致问题的原因。你们中的任何人都可以指出我正确的方向吗?