Angular 角度2可以激活导航
我有以下问题。我已经做了一个CanActivate守卫,如果您登录,您可以“转到”债务组件。我的问题是当我登录时,我想将用户重定向到Debts组件(因为RegistrationComponent是默认的),但它不工作(实际上我的页面被阻塞了..我什么都做不了)。我的激活功能Angular 角度2可以激活导航,angular,angular2-routing,Angular,Angular2 Routing,我有以下问题。我已经做了一个CanActivate守卫,如果您登录,您可以“转到”债务组件。我的问题是当我登录时,我想将用户重定向到Debts组件(因为RegistrationComponent是默认的),但它不工作(实际上我的页面被阻塞了..我什么都做不了)。我的激活功能 export class AuthGuardService implements CanActivate { constructor(private router: Router) { } 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);
}
})
})
}
我所做的是一种黑客行为,但它的工作完美无瑕: 首先,我在我的
logincomponent
路径上设置了Guard
{ path: 'login', component: LoginComponent, canActivate: [AuthGuard] }
然后我使用RouterStateSnapshot
获取URL状态的单个实例,指示用户试图访问的内容
然后,我可以在警卫室管理案件:
从'@angular/Router'导入{CanActivate,Router,ActivatedRouteSnapshot,routerstatesapshot};
...
/**
*通过身份验证保护要到达的路由
*/
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):布尔值{
//根据令牌的存在设置用户身份验证状态
this.authService.setLoggedInState();
//检查用户身份验证状态
if(this.authService.isAuthenticated){
//当用户已通过身份验证时显式导航到“/login”
如果(state.url=='/login'){
this.router.navigate(['/dashboard']);//您的债务
}
返回true;
}否则{
//允许路由到“./login”以获得身份验证
如果(state.url=='/login'){
返回true;
}
//未经身份验证时指向任何URL的显式导航
this.router.navigate(['/login']);
返回false;
}
}
有关快照的文档链接:
要使其在您的案例中发挥作用,您只需将setLoggedInState()
适应您的案例,您似乎已经具备了这种能力
N.B:我将此解决方案称为黑客,因为您实际上在
登录
上设置了一个防护,而即使用户未经身份验证,它仍然允许用户访问它。尽管如此,它仍然很有效。在你的帖子中有一些我不明白的地方。确切的问题是什么?如果用户已登录,是否希望用户转到DebtsComponent
?如何访问登录组件?我从菜单:)访问登录组件时,它看起来像(债务帐户单出)而不是(注册登录)。我的问题是:我想将用户总是(当他登录时)重定向到DebtsComponent(当他想访问登录/注册组件时),并将用户总是(当他未登录时)重定向到LoginComponent(当他想访问Debts/帐户组件时)。登录时,我们可能需要代码,但是我的提示是,在登录
时,您应该尝试导航到您的债务组件,并且在您的guard中,如果用户是loggedIn(而不是在您的guard中导航),则只返回true
。是的,是的,我这样做了,它工作正常(这不是问题:D)。看,在您登录后,您被重定向到localhost/deborts,这没问题,但是用户可以自己更改URL(localhost/login),我想在他登录时重定向他(因为您已经登录时无法登录:P)。你知道我在说什么吗(哦,好吧。我现在明白了。非常感谢:)实际上,我不得不“更改”一点这段代码,但效果非常好!谢谢:)没问题!很高兴我能帮上忙:)@AlexBeugnet不过我不会称之为黑客,对我来说一切都是合法的。你的警卫如何行动完全取决于你。一般来说,基于ActivatedRouteSnapshot
的警卫决策还允许您为不同的路由回收单个警卫,而不是为不同的路由创建多个单独的警卫。
{ path: 'login', component: LoginComponent, canActivate: [AuthGuard] }