gpt4 book ai didi

Angular2 CanActivate 导航

转载 作者:太空狗 更新时间:2023-10-29 17:50:19 26 4
gpt4 key购买 nike

我有以下问题。我制作了一个 CanActivate Guard,如果您已登录,您可以“转到”债务组件。我的问题是,当我登录时,我想将用户重定向到债务组件(因为 RegistrationComponent 是默认组件),但它不起作用(实际上我的页面被阻塞了……而且我无能为力)。我的 CanActivate 函数

export class AuthGuardService implements CanActivate {

constructor(private router: Router) { }

canActivate(): Promise<boolean>{
return checkIfAuth().then(() => {
setLoggedIn(true);
this.router.navigate(['/debts']); // <- broken :(
return true;
}).catch(() => {
setLoggedIn(false);
this.router.navigate(['/login']); // <- broken :(
return false;
})
}
}


export function checkIfAuth () {
return new Promise((resolve, reject) => {
firebase.auth().onAuthStateChanged((user) => {
if(user){
return resolve(true);
}
else{
return reject(false);
}
})
})
}

任何我的 app.routing

const APP_ROUTES: Routes = [
{ path: '', redirectTo: '/registration', pathMatch: 'full' },
{ path: 'registration', component: RegistrationComponent },
{ path: 'login', component: LoginComponent },
{ path: 'myaccount', component: AccountComponent, canActivate: [AuthGuardService]},
{ path: 'debts', component: DebtsComponent, canActivate: [AuthGuardService]}
];

最佳答案

我所做的是一种 hack,但它完美地工作:

首先,我在我的 LoginCompoment 路由上设置了一个 Guard

{ path: 'login', component: LoginComponent, canActivate: [AuthGuard] }

然后我使用 RouterStateSnapshot 获取我的 URL 状态的单个实例,指示我用户试图访问的内容。

然后我可以管理 Guard 中的案例:

import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

...

/**
* Protects the routes to reach with authentication
*/
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
// Set user authentication state depending on the token's existance
this.authService.setLoggedInState();
// Check user authentication state
if (this.authService.isAuthenticated) {
// Explicit navigation to '/login' while the user is already authenticated
if (state.url === '/login') {
this.router.navigate(['/dashboard']); // Debts for you
}
return true;
} else {
// Allow route to './login' to get authenticated
if (state.url === '/login') {
return true;
}
// Explicit navigation to any URL while not being authenticated
this.router.navigate(['/login']);
return false;
}
}

有关快照的文档链接:https://angular.io/docs/ts/latest/guide/router.html#!#sts=Snapshot:%20the%20no-observable%20alternative

要使其适用于您的情况,您只需调整 setLoggedInState() 以适应您似乎已经拥有的情况。

N.B : 我将此解决方案称为 HACK,因为您实际上在 Login 上设置了保护,同时它仍然允许用户访问即使他没有经过身份验证。仍然运作良好。

关于Angular2 CanActivate 导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41608830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com